7.1 Ansible 动态获取主机清单
場景
在實際工作環境中,較大的企業通常有內部的CMDB管理系統,每個部門基本也都有開發自己的運管系統之類,比如最基礎的本部門有哪些機器,它們都是什么配置,基本都是通過運管系統管理。這套內部系統可能已經使用很長時間,內部也形成了一定的規范,比如初始化機器會有腳本自動注冊機器基礎信息到系統中,也就是說相應的運管系統才保存在一手完整的元數據信息,當然這一類的運管系統通常都有API對外暴露供用戶使用,比如調curl某個地址,返回全部機器IP等
換句話說,我們使用Ansible管理的機器IP地址,可能來自于某個接口返回的信息里,或者說存放在某個數據庫里,此時我們當然可以每次接口有數據更新,人工將更新的內容拷貝到我們的主機清單里,這種方式缺點顯而易見,當機器規模比較大,更新較為頻繁,手動維護兩者之間的同步,費時費力,難保不出錯
此時我們就想,能不能寫一個腳本,自動調用運管系統里的相關接口,獲取指定的IP列表呢,比如調A腳本功能是返回全部WEB機器列表,B腳本功能是返回全部數據庫機器列表,由于每次執行playboook這些腳本都重新執行一次,即每次都動態拿到IP列表,這樣只要接口不變,腳本只要寫一次即可長久使用,不用擔心兩邊IP列表不同步的問題
類似這種需求,就需要用到Ansible動態獲取主機清單的功能(dynamic inventory),與之對應之前手動寫死機器列表的方法,稱之為靜態主機清單(static inventory)
實現方式
具體來說,我們需要準備一個可執行文件,充當主機清單用。所謂可執行即擁有+x權限,該文件可以是腳本文件,如python、php腳本,也可以是二進制文件,比如go、c語言編譯后的二進制可執行腳本,這個腳本準備好之后,使用方法類似如下
ansible-playbook test1.yaml -i ${my-inventory-script}-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語言寫的,其它編程語言情況類似,如果把上面的返回信息轉成我們之前學過的主機清單樣式,類似下面這樣
# 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規定了一個動態獲取主機清單的腳本,需要支持兩個參數即,--list 和 --host HOST
./my-inventory-script --list 使用來返回主機清單信息的,如上面所示,返回的數據是JSON格式./my-inventory-script --host HOST 這里的HOST指的就是主機清單IP地址,正常是循環調用這個接口來得到主機變量的,不過一般我們用`--list`返回的信息使其帶有 _meta ,這個特殊信息用來表示主機變量,那么只需要讓這個接口返回"空",即可,返回的數據是JSON格式python獲取動態主機清單實踐
我們以python語言為例,演示以下具體用法
腳本地址 https://gitee.com/as4k/ysansible/tree/master/dynamic-inventory
python代碼細節,我就不多說了,如果需要大家可自行到網上百度學習,我們直接執行看下效果
# 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總結
以上是生活随笔為你收集整理的7.1 Ansible 动态获取主机清单的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 修改联通服务器密码怎么修改,联通宽带修改
- 下一篇: 水电站10kV厂用电保护装置改造