はじめに
Ansible のロールでは、ロールの変数を vars/main.yml に、デフォルト値を defaults/main.yml に定義するというのが基本的なディレクトリ、ファイル構造です。
いつのバージョンからかはわかりませんが、それぞれ main.yml ではなくて main ディレクトリを用意して、その中に複数ファイルを入れておく構造でも読み取ってくれます。 この仕様が最近ドキュメントに明記されました。
Directories defaults and vars may also include nested directories.
Roles — Ansible Community Documentation
私がこの仕様を知ったのもこのプルリクでした。へ〜と思ったので試してみました。
- 検証環境
- ansible-core 2.12.0
- ansible-core 2.16.2
お試し
以下のファイル構成で試します。main.yml ではなく、main ディレクトリなところがポイントです。
.
├── playbook.yml
└── roles
└── myrole
├── defaults
│ └── main
│ ├── defaults01.yml
│ └── defaults02.yml
├── tasks
│ └── main.yml
└── vars
└── main
├── vars01.yml
└── vars02.yml
ロールの各種ファイルの準備
myrole ロールとして、vars や defaults 変数定義、タスクの定義します。
defaults
roles/myrole/defaults/main/defaults01.yml:
--- defaults01_var: var in defaults/main/default01.yml
roles/myrole/defaults/main/defaults02.yml:
--- defaults02_var: var in defaults/main/default02.yml
vars
roles/myrole/vars/main/vars01.yml:
--- vars01_var: var in vars/main/vars01.yml
roles/myrole/vars/main/vars02.yml:
--- vars02_var: var in vars/main/vars02.yml
tasks
ここまで定義してきた変数をただ表示するだけです。
roles/myrole/tasks/main.yml:
--- - name: Test Debug ansible.builtin.debug: msg: - "{{ vars01_var }}" - "{{ vars02_var }}" - "{{ defaults01_var }}" - "{{ defaults02_var }}"
Playbookの準備
ロールを呼び出す Playbook 側です。
--- - hosts: localhost gather_facts: false tasks: - name: Role Test ansible.builtin.import_role: name: myrole
Playbook の実行
それでは Playbook を実行します。
% ansible-playbook -i localhost, playbook.yml
PLAY [localhost] *****************************************************************************************************
TASK [myrole : Test Debug] ******************************************************************************************
ok: [localhost] => {
"msg": [
"var in vars/main/vars01.yml",
"var in vars/main/vars02.yml",
"var in defaults/main/default01.yml",
"var in defaults/main/default02.yml"
]
}
PLAY RECAP ***********************************************************************************************************
localhost : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
想定通り vars/main ディレクトリや defaults/main ディレクトリ内で定義した変数の値が表示されました。
おわりに
インベントリ変数でいう group_vars/グループ名.yml だけでなく group_vars/グループ名/*.yml も、host_vars/ホスト名.yml だけでなく host_vars/ホスト名/*.yml でも読み込んでくれる仕様と似ているなと思いました。