開發動態的Inventory資料來源

動態 Inventory 所介紹,ansible可以從一個動態的資料來源獲取到inventory資訊,包含雲端資料來源

怎麼寫一個自己的資料來源?

很簡單!我們僅僅需要建立一個在適當參數下,能夠返回正確JSON格式資料的指令碼或者程式,你可以使用任何語言來實現.

指令碼規範

當我們在外部使用``–list``參數呼叫這個指令碼時,這個指令碼必須返回一個JSON雜湊/字典,它包含所管理的所有組.每個組的value應該是一個關於其包含的主機/IP雜湊/字典,它可能是一個子組或者組的變數或者僅僅是一個主機/IP的列表, 例如:

{
    "databases"   : {
        "hosts"   : [ "host1.example.com", "host2.example.com" ],
        "vars"    : {
            "a"   : true
        }
    },
    "webservers"  : [ "host2.example.com", "host3.example.com" ],
    "atlanta"     : {
        "hosts"   : [ "host1.example.com", "host4.example.com", "host5.example.com" ],
        "vars"    : {
            "b"   : false
        },
        "children": [ "marietta", "5points" ]
    },
    "marietta"    : [ "host6.example.com" ],
    "5points"     : [ "host7.example.com" ]
}

New in version 1.0.

在版本1.0之前,每一個組只能是一個包含hostnames/IP Address的列表,像上面的webservers, marietta, 5points組

當我們使用``–host <hostname>``(這裡的<hostname>只指相對上面資料中的host)參數呼叫時,這個指令碼必須返回一條空的JSON 雜湊/字典, 或者關於變數的JSON雜湊/字典,這些變數將被用來模板或者playbooks. 返回變數是可選的,如果指令碼不希望這樣做,返回一條空的雜湊/字典即可:

{
    "favcolor"   : "red",
    "ntpserver"  : "wolf.example.com",
    "monitoring" : "pack.example.com"
}

開啟呼叫外部Inventory指令碼

New in version 1.3.

這個inventory腳本系統在所有的Ansible版本中都將會被呼叫,但是當使用``–host``參數操作每一臺主機時,這將是十分麻煩(低效率),尤其是當它用在呼叫遠端子系統時.在Ansible 1.3以後的版本(包含1.3),如果inventory指令碼返回的頂級元素為”_meta”,它可能會返回所有主機的變數.如果這個元素中包含一個名為”hostvars”的value,這個inventory指令碼對每一臺主機使用``–host``時將不會被呼叫.這將大大增加主機的執行效率,並且也使客戶端更容易實現這個指令碼的資料快取.

這個資料將會被新增到JSON字典的頂級,像下面的格式:

{

    # results of inventory script as above go here
    # inventory指令碼將到此終止
    # ...

    "_meta" : {
       "hostvars" : {
          "moocow.example.com"     : { "asdf" : 1234 },
          "llama.example.com"      : { "asdf" : 5678 },
       }
    }

}

See also

Python API
Python API to Playbooks and Ad Hoc Task Execution
Developing Modules
How to develop modules
Developing Plugins
How to develop plugins
Ansible Tower
REST API endpoint and GUI for Ansible, syncs with dynamic inventory
Development Mailing List
Mailing list for development topics
irc.freenode.net
#ansible IRC chat channel