Ansible Inventory指北进阶
Ansible的inventory文件定義了它要操作的一些主機,它可以通過inventory對這些主機進行操控。默認的inventory文件是/etc/ansible/hosts 。也可通過-i選項,來指定不同的inventory文件。
Ansible也支持從云中拉取inventory文件執行,拉取的文件可以試YMAL,ini,etc等格式。 這個是在ansbible 的 2.4版本新引入的功能,Ansible也有inventory的插件來讓inventory變的更靈活和自定義化。
inventory的格式一般如下:
mail.example.com[webservers] foo.example.com bar.example.com[dbservers] one.example.com two.example.com three.example.com關于inventory的詳細描述,參考我早期參與的翻譯項目,Ansible 中文權威
動態inventory
靜態 Inventory 指的是在文件中指定的主機和組,動態 Inventory 指通過外部腳本獲取主機列表,并按照 ansible 所要求的格式返回給 ansilbe 命令的。這部分一般會結合 CMDB 資管系統、云計算平臺等獲取主機信息。
看到一段很不錯的代碼,參考下。
#!/usr/bin/python #!/Users/aihe/.pyenv/shims/python #coding : utf-8import json import sysdef group():host1 = ['192.168.0.112']host2 = ['192.168.0.112','192.168.0.109']group1 = 'test1'group2 = 'test2'hostdata = {group1:{"hosts":host1},group2:{"hosts":host2}}print(json.dumps(hostdata,indent=4))def host(ip):info_dict = {"192.168.0.112": {"ansible_ssh_host":"192.168.0.112","ansible_ssh_port":22,"ansible_ssh_user":"root","ansible_ssh_pass":"123457"},"192.168.0.109": {"ansible_ssh_host":"192.168.0.109","ansible_ssh_port":22,"ansible_ssh_user":"root","ansible_ssh_pass":"xxxx"}}# 判斷key是否在字典中,在的話打印出來,不在的話打印空字典。if ip in info_dict:print(json.dumps(info_dict[ip],indent=4))else:print(json.dumps({},indent=4))if len(sys.argv) == 2 and (sys.argv[1] == '--list'):group() elif len(sys.argv) == 3 and (sys.argv[1] == '--host'):host(sys.argv[2]) else:print("Usage: %s --list or --host <hostname>" % sys.argv[0])sys.exit(1)單獨執行的時候
image.png
結合Ansible執行。雖然連接報錯誤了,但是這因為主機是隨便定義的,如果是可以連接的主機則是正常工作的。
image.png
到這里,其實我們的動態inventory大體框架已經出來了,剩下的則是將代碼中的硬編碼變為動態獲取,數據庫或其它持久存儲的地方獲取即可。
問題
在寫這段代碼的時候遇到幾個問題,很有意思,解決問題的過程就是讓我們成長的過程...
另外報的錯誤實在也是有點迷惑人啊。
inventory插件問題
錯誤截圖,看到因為ini的插件無法解析json數據
image.png
查看所有可用的插件列表
ansible-doc -t inventory -l image.pngimage.png
修改插件的位置在。
image.png
執行格式問題
錯誤中還有關于執行格式錯誤的信息。
image.png剛開始一直報執行格式錯誤問題,這個問題有點荒唐,因為我安裝了pyenv,python執行的路徑在開頭寫成了
而這個文件是sh文件,普通的可執行文本文件了,導致出錯,暈掉...
將開頭的#!修改為python的解釋器。然后就執行成功了。
#!/usr/bin/python最后
要知道inventory的格式,inventory在ansible中可以理解為主機清單。動態的inventory可以給我們提供很多便利的操作,我們可以更靈活的控制主機了。
如果你的數據格式,在已有的inventory插件中,你也可以自己嘗試開發一個,具體開發參考下面的參考部分。
參考
- Ansible 進階 | 動態 Inventory
- 開發Ansible inventory
總結
以上是生活随笔為你收集整理的Ansible Inventory指北进阶的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CloudFoundry命令行和Kube
- 下一篇: 类的特殊成员方法