はじめに
Ansible は、様々な場所に変数を定義できます。便利な半面、優先順位がどうだったか混乱してしまうこともあります。 調べたいときに確認するのが、以下の公式ドキュメントのページです。
この中で、20. role (and include_role) params
という、割と強めな定義方法が何なのか分かりませんでした。
以下のブログにもあるように、同じように感じてるかがいらっしゃるようです。
ちゃんと調べてみると、以下の記事が参考になりました。 qiita.com
--- - name: "test ansible var precedence" hosts: all # ...(略).. roles: - role: test_role var_test20: "This is 'role (and include_role) params'"
このように、roles
ディレクティブを利用した際に、role
と同じレベル定義した変数のことのようです。
この記事では、一応自分でも検証してみます。
検証
優先順位をあらためて確認すると、20. role (and include_role) params
は 19. set_facts / registered vars
より強いようです。
19. set_facts / registered vars 20. role (and include_role) params 21. include params 22. extra vars (always win precedence)
なので、set_fact
より優先されることをもって確認したいと思います。
ファイル構成
test.yml
から testrole
ロールを呼び出す構成です。
. ├── roles │ └── testrole │ └── tasks │ └── main.yml └── test.yml
test.yml
--- - hosts: localhost gather_facts: false roles: - role: testrole vars: msg: I'm in roles vars # 似て非なる定義(どれだろう・・優先度は低め) msg: I'm in roles param # これが 20. role (and include_role) params のはず
roles/testrole/tasks/main.yml
--- - name: set_fact set_fact: msg: "I'm in tasks/main set_fact" # 19. set_facts / registered vars - name: debug debug: msg: "{{ msg }}"
実行
Playbook を実行します。
$ ansible-playbook -i localhost, test.yml PLAY [localhost] ************************************************************************************************* TASK [testrole : set_fact] *************************************************************************************** ok: [localhost] TASK [testrole : debug] ****************************************************************************************** ok: [localhost] => { "msg": "I'm in roles param" } PLAY RECAP ******************************************************************************************************* localhost : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
I'm in roles param
が表示されました。set_fact
より優先されたことが分かりました。
補足
さすがに 22. extra vars (always win precedence)
には負けます。
$ ansible-playbook -i localhost, test.yml -e msg="extra_vars" PLAY [localhost] ***************************************************************************************************** TASK [testrole : set_fact] ******************************************************************************************* ok: [localhost] TASK [testrole : debug] ********************************************************************************************** ok: [localhost] => { "msg": "extra_vars" } PLAY RECAP *********************************************************************************************************** localhost : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
おわりに
混乱のもとになるので、ある程度定義場所は制限したほうが良いと思います。