上篇主要講解了Ansible 的安裝和配置,而且根據不一樣的業務場景將服務器的信息存放在Ansible的Inventory中,其實存放這樣的數據每次更新都須要咱們自動的添加和刪除,這樣對於咱們維護起來很不方便,而Ansible 提供了支持動態的從外部獲取主機列表和主機組數據;通常狀況動態獲取主機信息都會結合CMDB、Zabbix、Cpbbler、雲主機管理平臺(如AWS、阿里雲)在一塊兒使用;python
Ansible 動態Inventory 是經過調用外部腳本生成指定格式的json數據,這裏不會限制任何語言,只要能夠返回指定格式便可,下面看下咱們須要返回什麼樣子的格式;web
{ "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數據,看下映射關係json
[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程序,這裏咱們把本身的數據源定義成爲變量,下面咱們來看下例子ssh
#!/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
執行命令之後返回:spa
這裏返回的結果集與咱們在/etc/ansible/hosts配置服務器組返回結果一致,其實動態只是讓你更加便利的維護服務器組數據。code
注意:server
ansible -i 參數表明指定Inventory 文件,可是咱們指定文件之後還須要指定運行的服務器組或者服務器,若是須要全部的服務器都執行那麼咱們這裏經過all 來實現。blog