てくなべ (tekunabe)

ansible / network automation / 学習メモ

[Ansible] group_vars 配下にグループ名の「ディレクトリ」を用意すると複数の変数ファイルをまとめられる

■ はじめに

例えば、グループ名が junos の場合、 gourp_vars/junos.yml のような ファイルを用意して、グループ共通で利用する変数を定義すできます。このとき、ファイル名はグループ名(ここでは junos)を含む形式に固定されます。

応用的なやり方として、gourp_vars/junos ディレクト を用意すると、そのディレクトリ配下に、複数の任意の名前の変数ファイルを置くことができます。

  • グループ名ディレクトリを利用した変数ファイルの配置例
.
|-- group_vars
|   `-- junos             # グループ名のディレクトリ
|       |-- commands.yml  # junos が利用する変数ファイル
|       |-- general.yml   # junos が利用する変数ファイル
|       `-- login.yml     # junos が利用する変数ファイル

group_vars/グループ名 ディレクトリだけでなく, host_vars/ホスト名 ディレクトリでも同じです。

公式ドキュメント上の記載

As an advanced use case, you can create directories named after your groups or hosts, and Ansible will read all the files in these directories in lexicographical order.

https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html#splitting-out-host-and-group-specific-data

なお、複数ファイルで変数定義が競合した場合はファイル名順で後にロードされたものが採用されます。(Ansible 徹底入門 P152から)


■ サンプル

具体的なサンプルで動作例をご紹介します。 ここでは group_vars/junos ディレクト を作成し、その中にログイン情報、汎用的な情報、コマンド情報を定義した3つの変数フィアルを用意しています。

  • ファイル構成
.
|-- group_vars
|   `-- junos
|       |-- commands.yml
|       |-- general.yml
|       `-- login.yml
|-- inventory
`-- varstest.yml

インベントリファイル

  • inventory
[junos]
vsrx1 ansible_host=172.16.0.1

変数ファイル

  • group_vars/junos/login.yml (ログイン情報を定義)
---
ansible_network_os: junos
ansible_connection: netconf
ansible_user: admin
ansible_password: admin9999
  • group_vars/junos/commands.yml (実行したいコマンドを定義)
---
show_commands:
  - show version
  - show configuration
  - show interfaces
  • group_vars/junos/general.yml(汎用的な変数を定義)
---
greeting_msg: Hello, Junos!

Playbook

  • varstest.yml
- hosts: junos
  gather_facts: no

  tasks:
    - name: command test
      junos_command:
        commands: "{{ item }}"
      loop: "{{ show_commands }}"  # group_vars/junos/commands.yml 内の変数

    - name: debug test
      debug:
        msg: "{{ greeting_msg }}"   # group_vars/junos/general.yml 内の変数

実行結果

$ ansible-playbook -i inventory varstest.yml

PLAY [junos] ***************************************************************

TASK [command test] ********************************************************
ok: [vsrx1] => (item=show version)
ok: [vsrx1] => (item=show configuration)
ok: [vsrx1] => (item=show interfaces)

TASK [debug test] **********************************************************
ok: [vsrx1] => {
    "msg": "Hello, Junos!"
}

PLAY RECAP *****************************************************************
vsrx1                      : ok=2    changed=0    unreachable=0    failed=0

これにより、以下の 3つのことが確認できました。

  • group_vars/junos/login.yml で定義したログイン情報によってログインした
  • group_vars/junos/commands.yml で定義したコマンドを実行した
  • group_vars/junos/general.yml で定義したあいさつ文が表示された