てくなべ (tekunabe)

ansible / network automation / 学習メモ

[Ansible] role の vars ディレクトリ配下に複数の変数ファイルを配置してまとめて読み込む方法

■ はじめに

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

変数 var1var2 の値を表示するだけのタスクです。それぞれ別のファイルで定義している変数です。

---
- 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.ymlvar2.yaml でそれぞれ定義した変数 var1var2 の値が表示されまた。

なお、main.ymlmain ディレクトリが存在する場合は、 main.yml 飲み読み込んで、main ディレクトリ配下のファイルは無視されました。


■ まとめ

role の vars ディレクトリ配下にさらに main ディレクト を用意して、その中に変数ファイルを置いておくと、まとめて読み込まれることを確認しました。

前述のように、公式ドキュメントに載っている方法ではありませんが、試したら、という扱いです。

試したが限り、vars/main/ ディレクトリだけでなく、defaults/main/ ディレクトリでも同様に、複数の変数ファイルをまとめて読み込まれました。

なちみに、なぜこの方法を思いついたかというと、 group_vars/グループ名.yml だけでなく、group_vars/グループ名/ファイル1.ymlgroup_vars/グループ名/ファイル2.yml のように、グループ名をディレクトリ化して複数ファイルを読み込む方法をたまたま知っていたためです。