Ansible 之動態Inventory文件(二)
上篇主要講解了Ansible 的安裝和配置,並且根據不同的業務場景將服務器的信息存放在Ansible的Inventory中,其實存放這樣的數據每次更新都需要我們自動的添加和刪除,這樣對於我們維護起來很不方便,而Ansible 提供了支持動態的從外部獲取主機列表和主機組數據;一般情況動態獲取主機信息都會結合CMDB、Zabbix、Cpbbler、雲主機管理平臺(如AWS、阿裏雲)在一起使用;
Ansible 動態Inventory 是通過調用外部腳本生成指定格式的json數據,這裏不會限制任何語言,只要可以返回指定格式即可,下面看下我們需要返回什麽樣子的格式;
{"webserver": # 定義webserver組 { "hosts": ["39.105.0.244"], # webserver 組內主機 "vars": { # 參數 "ansible_ssh_pass": "123456", # Inventory 內置變量 "ansible_port": "61821" } }, "dbserver": {"hosts": ["47.104.149.180"], "vars": { "ansible_ssh_pass": "123456", "ansible_port": "61821" } } }
切記上面的hosts,vars還有children這些變量是固定的,我們不能在返回的json格式裏面隨意的定義,如果定義成為其他的這裏就會出現報錯,下面我們把上面的json數據轉換為靜態的Inventory數據,看下映射關系
[webserver] 39.105.0.244 [dbserver] 47.104.149.180 [webserver:vars] ansible_ssh_pass: "123456", ansible_port: "61821" [dbserver:vars] ansible_ssh_pass: "123456", ansible_port: "61821"
通過映射關系我們可以把對/etc/ansible/hosts 數據 和動態獲取Inventory數據的對比下,動態的只是通過其他的地方獲取數據組合成為Ansible Inventory 可識別的數據而已;
下面我們通過python語言來實現一個demo程序,這裏我們把自己的數據源定義成為變量,下面我們來看下例子
#!/usr/bin/env python # -*- coding:utf-8 -*- import json def inventory_groups(): groups = { "webserver": # 定義webserver組 { "hosts": ["39.105.0.244"], # webserver 組內主機 "vars": { # 參數 "ansible_ssh_pass": "123456", # Inventory 內置變量 "ansible_port": "61821" } }, "dbserver": { "hosts": ["47.104.149.180"], "vars": { "ansible_ssh_pass": "123456", "ansible_port": "61821" } } } return json.dumps(groups, indent=4) if __name__ == ‘__main__‘: print(inventory_groups())
我們在Ansible 運行下我們寫好的腳本,首先我們指定webserver 執行ping操作
ansible -i inventory.py webserver -m ping
執行命令以後返回:
這裏返回的結果集與我們在/etc/ansible/hosts配置服務器組返回結果一致,其實動態只是讓你更加便利的維護服務器組數據。
註意:
ansible -i 參數代表指定Inventory 文件,但是我們指定文件以後還需要指定運行的服務器組或者服務器,如果需要所有的服務器都執行那麽我們這裏通過all 來實現。
Ansible 之動態Inventory文件(二)