More than 1 year has passed since last update.

ansibleは、インベントリファイルに記載されているホストを認識するのですが、実はInventoryファイルは静的なテキストファイル以外に、実行可能なスクリプトファイルを指定できます。

やり方

Dynamic Inventory
に詳しく記載されていますが、以下のようなjsonを返すスクリプトファイルを用意し、実行権限を付けて保存したファイルを ansible-playbookコマンド等の -iオプションに渡せば良いだけです。

{
    "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" ]
}

ansibleは、インベントリファイルに実行権限が付いていなければ、通常のインベントリファイルとして読み込み、実行権限が付いていれば実行した結果帰ってくるjsonを読み込むという処理をしているようです。

これで何が嬉しいのか

構築済みのシステム等では既にmuninやnagios,zabbix等の監視ソフトなどでサーバーの一覧やグループ化をされていると思います。
ansibleからはそちらのデータをマスターとして扱い、直接参照するような簡単なスクリプトを用意する方が効率的だと思われます。
また、inventoryスクリプトはmoduleと同じく言語は問わずjsonを標準出力で返せれば何でもOKなようなので、作成の閾は低いですね。

既に用意されているスクリプト

Dynamic Inventory用のスクリプトは既にいくつか用意されています。
https://github.com/ansible/ansible/tree/devel/plugins/inventory
EC2やvagrant、zabbixもすでにありましたね。