7.1 Ansible 动态获取主机清单
場景
在實際工作環(huán)境中,較大的企業(yè)通常有內(nèi)部的CMDB管理系統(tǒng),每個部門基本也都有開發(fā)自己的運管系統(tǒng)之類,比如最基礎(chǔ)的本部門有哪些機器,它們都是什么配置,基本都是通過運管系統(tǒng)管理。這套內(nèi)部系統(tǒng)可能已經(jīng)使用很長時間,內(nèi)部也形成了一定的規(guī)范,比如初始化機器會有腳本自動注冊機器基礎(chǔ)信息到系統(tǒng)中,也就是說相應(yīng)的運管系統(tǒng)才保存在一手完整的元數(shù)據(jù)信息,當(dāng)然這一類的運管系統(tǒng)通常都有API對外暴露供用戶使用,比如調(diào)curl某個地址,返回全部機器IP等
換句話說,我們使用Ansible管理的機器IP地址,可能來自于某個接口返回的信息里,或者說存放在某個數(shù)據(jù)庫里,此時我們當(dāng)然可以每次接口有數(shù)據(jù)更新,人工將更新的內(nèi)容拷貝到我們的主機清單里,這種方式缺點顯而易見,當(dāng)機器規(guī)模比較大,更新較為頻繁,手動維護兩者之間的同步,費時費力,難保不出錯
此時我們就想,能不能寫一個腳本,自動調(diào)用運管系統(tǒng)里的相關(guān)接口,獲取指定的IP列表呢,比如調(diào)A腳本功能是返回全部WEB機器列表,B腳本功能是返回全部數(shù)據(jù)庫機器列表,由于每次執(zhí)行playboook這些腳本都重新執(zhí)行一次,即每次都動態(tài)拿到IP列表,這樣只要接口不變,腳本只要寫一次即可長久使用,不用擔(dān)心兩邊IP列表不同步的問題
類似這種需求,就需要用到Ansible動態(tài)獲取主機清單的功能(dynamic inventory),與之對應(yīng)之前手動寫死機器列表的方法,稱之為靜態(tài)主機清單(static inventory)
實現(xiàn)方式
具體來說,我們需要準備一個可執(zhí)行文件,充當(dāng)主機清單用。所謂可執(zhí)行即擁有+x權(quán)限,該文件可以是腳本文件,如python、php腳本,也可以是二進制文件,比如go、c語言編譯后的二進制可執(zhí)行腳本,這個腳本準備好之后,使用方法類似如下
ansible-playbook test1.yaml -i ${my-inventory-script}-i參數(shù)相信大家已經(jīng)熟悉了,之前我們用它是接靜態(tài)主機清單文件,該參數(shù)同樣可以接動態(tài)主機清單文件
那么這個腳本具體該有些什么內(nèi)容呢,簡單來說這個腳本返回的是主機清單里該有的信息,也就是:機器IP、機器分組、主機變量、組變量這些,比如下面的示例
return {'mygroup1': {'hosts': ['192.168.31.100', '192.168.31.101'],'vars': {'mytest_var1': 'hello1','mytest_var2': 'hello2','mytest_common': 'hello_common'}},'mygroup2': {'hosts': ['192.168.31.102'],'vars': {'mytest_var3': 'hello3','mytest_common': 'hello_common'}},'_meta': {'hostvars': {'192.168.31.100': {'host_specific_var': 'foo100'},'192.168.31.101': {'host_specific_var': 'bar101'}}} }上面的返回信息是以python語言寫的,其它編程語言情況類似,如果把上面的返回信息轉(zhuǎn)成我們之前學(xué)過的主機清單樣式,類似下面這樣
# cat /etc/ansible/hosts [mygroup1] 192.168.31.100 host_specific_var=foo100 192.168.31.101 host_specific_var=bar101[mygroup2] 192.168.31.102[mygroup1:vars] mytest_var1=hello1 mytest_var2=hello2 mytest_common=hello_common[mygroup2:vars] mytest_var3=hello3 mytest_common=hello_common整體來說,Ansible規(guī)定了一個動態(tài)獲取主機清單的腳本,需要支持兩個參數(shù)即,--list 和 --host HOST
./my-inventory-script --list 使用來返回主機清單信息的,如上面所示,返回的數(shù)據(jù)是JSON格式./my-inventory-script --host HOST 這里的HOST指的就是主機清單IP地址,正常是循環(huán)調(diào)用這個接口來得到主機變量的,不過一般我們用`--list`返回的信息使其帶有 _meta ,這個特殊信息用來表示主機變量,那么只需要讓這個接口返回"空",即可,返回的數(shù)據(jù)是JSON格式python獲取動態(tài)主機清單實踐
我們以python語言為例,演示以下具體用法
腳本地址 https://gitee.com/as4k/ysansible/tree/master/dynamic-inventory
python代碼細節(jié),我就不多說了,如果需要大家可自行到網(wǎng)上百度學(xué)習(xí),我們直接執(zhí)行看下效果
# ls inventory.py README.md test1.yaml # ansible all -i inventory.py -m ping # ansible-playbook test1.yaml -i inventory.py大家自己寫腳本測試,可以使用下面這個命令,進行快速測試
./inventory.py --list | python -c "import json,sys; obj=json.load(sys.stdin); print(json.dumps(obj, indent=4))" && echo參考資料
https://docs.ansible.com/ansible/latest/user_guide/intro_dynamic_inventory.html https://docs.ansible.com/ansible/latest/dev_guide/developing_inventory.html總結(jié)
以上是生活随笔為你收集整理的7.1 Ansible 动态获取主机清单的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 修改联通服务器密码怎么修改,联通宽带修改
- 下一篇: 水电站10kV厂用电保护装置改造