てくなべ (tekunabe)

ansible / network / automation

[Ansible] -i オプションでディレクトリを指定すると複数のインベントリファイルをマージできる

■ はじめに

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

上記の通り、host1host2 に分かれて定義されていた vsrx グループがマージされ、vsx1vsrx2 の 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 にしていますので、vsrx1vsrx2 が対象になるはずです。

(認証情報を定義した変数ファイルは省略)

  • 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  

無事にvsrx1vsrx2 が対象になっていることを確認できました。

補足

■ まとめ

ansible-playbook コマンドなどの -i オプションに、ファイルではなく、ディレクトリを指定するとマージして扱えることを確認できました。

このような指定が必要になるケースは多くはないかもしれませんが、何かのときに思い出していただければ幸いです。