■ はじめに
Ansible の管理対象ホストを定義するインベントリは、ansible-playbook コマンドの -i オプションで指定します。スタティックなインベントリでも、ダイナミックインベントリでも同じです。
- コマンド例
$ ansible-playbook -i inventory site.yml
この -i オプションでは、ファイルの指定だけでなく、ディレクトリも指定できます。ディレクトリを指定した場合は、そのディレクトリ配下の複数のインベントリファイルをマージして扱うことができます。
この記事では、簡単な例で試してご説明します。
- 動作確認環境: Ansible 2.7.5
■ おためし
準備
inventories ディレクトリのインベントリファイルは以下のとおりです。
inventories/ |-- hosts1 `-- hosts2
それぞれのインベントリファイルの中身は以下のとおりです。
- hosts1
[vsrx] vsrx1 ansible_host=172.16.0.1 [vsrx:vars] ansible_network_os=junos ansible_connection=netconf
- hosts2
[vsrx] vsrx2 ansible_host=172.16.0.2
上記の 2ファイルをマージするとどの様になるかご想像つきましたでしょうか。
実行
それでは -i にディレクトリを指定して、インベントリファイルがマージでできているかを確認します。
ansible-inventory コマンド編
インベントリの情報を確認するための ansible-inventory コマンドを利用して確認します。
まず --graph オプションで、グループの所属状態を確認します。
$ ansible-inventory -i inventories --graph @all: |--@ungrouped: |--@vsrx: | |--vsrx1 | |--vsrx2
上記の通り、host1 と host2 に分かれて定義されていた vsrx グループがマージされ、vsx1 と vsrx2 の 2ホストが所属する状態になりました。
次に --list オプションででインベントリ情報のリストを表示してみます。
$ ansible-inventory -i inventories --list
{
"_meta": {
"hostvars": {
"vsrx1": {
"ansible_connection": "netconf",
"ansible_host": "172.16.0.1",
"ansible_network_os": "junos"
},
"vsrx2": {
"ansible_connection": "netconf",
"ansible_host": "172.16.0.2",
"ansible_network_os": "junos"
}
}
},
"all": {
"children": [
"ungrouped",
"vsrx"
]
},
"ungrouped": {},
"vsrx": {
"hosts": [
"vsrx1",
"vsrx2"
]
}
}
上記の通り、vsrx グループがマージさました。
また、host1 にのみ定義していた vsrx グループに対する変数 ansible_connection などもうまくマージされた後に適用されています。
ansible-playbook コマンド編
今度は、簡単な playbook を実行して試します。
- playbook (test.yml)
- hosts: all gather_facts: no tasks: - name: inventory merge test debug: msg: "I am {{ inventory_hostname }}"
対象は all にしていますので、vsrx1 と vsrx2 が対象になるはずです。
(認証情報を定義した変数ファイルは省略)
- playbook 実行
$ ansible-playbook -i inventories test.yml
PLAY [all] *******************************************************************
TASK [inventory merge test] **************************************************
ok: [vsrx1] => {
"msg": "I am vsrx1"
}
ok: [vsrx2] => {
"msg": "I am vsrx2"
}
PLAY RECAP *******************************************************************
vsrx1 : ok=1 changed=0 unreachable=0 failed=0
vsrx2 : ok=1 changed=0 unreachable=0 failed=0
無事にvsrx1 と vsrx2 が対象になっていることを確認できました。
補足
- 試せてはいませんが、スタティックインベントリとダイナミックインベントリもまぜてマージできるようです
- インベントリをディレクトリで指定した場合、
iniなどの拡張子のファイルは無視されます。 -iオプションだけでなく、ansible.cfgの[defaults]セクションにinventory=inventoriesと指定するなど、他の指定方法でも同じようにマージできます。
■ まとめ
ansible-playbook コマンドなどの -i オプションに、ファイルではなく、ディレクトリを指定するとマージして扱えることを確認できました。
このような指定が必要になるケースは多くはないかもしれませんが、何かのときに思い出していただければ幸いです。