■ はじめに
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
オプションに、ファイルではなく、ディレクトリを指定するとマージして扱えることを確認できました。
このような指定が必要になるケースは多くはないかもしれませんが、何かのときに思い出していただければ幸いです。