天天看點

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-8

import json
import sys

def 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)
           
  1. 單獨執行的時候
    Ansible Inventory指北進階
    image.png
  2. 結合Ansible執行。雖然連接配接報錯誤了,但是這因為主機是随便定義的,如果是可以連接配接的主機則是正常工作的。
    Ansible Inventory指北進階

到這裡,其實我們的動态inventory大體架構已經出來了,剩下的則是将代碼中的寫死變為動态擷取,資料庫或其它持久存儲的地方擷取即可。

問題

在寫這段代碼的時候遇到幾個問題,很有意思,解決問題的過程就是讓我們成長的過程...

另外報的錯誤實在也是有點迷惑人啊。

inventory插件問題
  1. 錯誤截圖,看到因為ini的插件無法解析json資料
    Ansible Inventory指北進階

檢視所有可用的插件清單

ansible-doc -t inventory -l
           
Ansible Inventory指北進階
  1. 更改ansible的inventory可用插件。啟用Ansible插件的配置在/etc/ansible/ansible.cfg檔案中,具體是那個檔案在起作用,執行執行

    ansible --version

    指令就可以看到。
    Ansible Inventory指北進階

修改插件的位置在。

Ansible Inventory指北進階
執行格式問題

錯誤中還有關于執行格式錯誤的資訊。

Ansible Inventory指北進階
  1. 錯誤原因

    剛開始一直報執行格式錯誤問題,這個問題有點荒唐,因為我安裝了pyenv,python執行的路徑在開頭寫成了

#!/Users/aihe/.pyenv/shims/python
           

而這個檔案是sh檔案,普通的可執行文本檔案了,導緻出錯,暈掉...

  1. 解決方案

将開頭的#!修改為python的解釋器。然後就執行成功了。

#!/usr/bin/python
           

最後

要知道inventory的格式,inventory在ansible中可以了解為主機清單。動态的inventory可以給我們提供很多便利的操作,我們可以更靈活的控制主機了。

如果你的資料格式,在已有的inventory插件中,你也可以自己嘗試開發一個,具體開發參考下面的參考部分。

參考