■ はじめに
role を構成する際、vars
ディレクトリ配下に main.yml
を作成して、変数を読み込ませます。
普通に考えると、vars/main.yml
という1つのファイルしか読み込めなさそうですが、複数のファイルに分割しておきたいこともあるかもしれません。
公式ドキュメントに載っていたわけではありませんが、vars
ディレクトリ配下にさらに main
ディレクトリ を用意して、その中に変数ファイルを置いておくと、まとめて読み込んでくれました。
「試したらできた」というレベルではありますが、この記事では簡単な例を元にして説明します。
- 環境
- Ansible 2.9.0
※ 将来仕様が変更されるかもしれませんのでご了承ください。あまりコードを追えていないのですが、おそらく vars 読み込み時に、find_vars_files
メソッド が allow_dir=True
で呼ばれるからではないかと思います。
■ ファイル・ディレクトリ構成
以下のようなファイル、ディレクトリ構成とします。
|--roles | |--testrole | | |--tasks | | | |--main.yml # ロールのタスク | | |--vars | | | |--main # 変数ファイルをまとめるディレクトリ | | | | |--var1.yml # 読み込みたい変数ファイル1 | | | | |--var2.yml # 読み込みたい変数ファイル2 |--site.yml # ロールを呼び出す Playbook
■ 各ファイルの作成
以下のようなファイルを作成します。
Playbook: site.yml
testrole
ロールを呼び出すだけの簡単な Playbook です。
--- - hosts: localhost gather_facts: no roles: - role: testrole
ロールのタスク: roles/testroke/tasks/main.yml
変数 var1
、var2
の値を表示するだけのタスクです。それぞれ別のファイルで定義している変数です。
--- - name: debug var1 debug: var: var1 # roles/testroke/vars/main/var1.yml 内で定義 - name: debug var2 debug: var: var2 # roles/testroke/vars/main/var2.yml 内で定義
変数ファイル: roles/testroke/vars/main/var1.yml
変数 var1
を定義します。
--- var1: var1!!
変数ファイル: roles/testroke/vars/main/var2.yml
変数 var2
を定義します。
--- var2: var2!!
ファイルの作成はここまでです。
■ 実行
Playbook を実行します。
$ ansible-playbook -i localhost, site.yml PLAY [localhost] ************************************************************************ TASK [testrole : debug var1] ************************************************************ ok: [localhost] => var1: var1!! TASK [testrole : debug var2] ************************************************************ ok: [localhost] => var2: var2!! PLAY RECAP ****************************************************************************** localhost : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
roles/testroke/vars/main/
ディレクトリの var1.yml
、var2.yaml
でそれぞれ定義した変数 var1
、var2
の値が表示されまた。
なお、main.yml
と main
ディレクトリが存在する場合は、 main.yml
飲み読み込んで、main
ディレクトリ配下のファイルは無視されました。
■ まとめ
role の vars
ディレクトリ配下にさらに main
ディレクトリ を用意して、その中に変数ファイルを置いておくと、まとめて読み込まれることを確認しました。
前述のように、公式ドキュメントに載っている方法ではありませんが、試したら、という扱いです。
試したが限り、vars/main/
ディレクトリだけでなく、defaults/main/
ディレクトリでも同様に、複数の変数ファイルをまとめて読み込まれました。
なちみに、なぜこの方法を思いついたかというと、 group_vars/グループ名.yml
だけでなく、group_vars/グループ名/ファイル1.yml
、group_vars/グループ名/ファイル2.yml
のように、グループ名をディレクトリ化して複数ファイルを読み込む方法をたまたま知っていたためです。