Changes in Ansible Variable Precedence Between v1.2 and v1.3 を見たら Ansible の変数の優先順が version 1.2 と 1.3 で変わってるって書いてあるじゃないですか!!
まだ本格導入してないから大丈夫だけど、この手のツールのバージョンアップは慎重に行う必要がありますね。
やらなきゃなぁと思っていた変数の優先度整理をこれを機にやってみました。
https://github.com/cookrn/ansible_variable_precedence に変数の優先度確認用の Playbook があったので、これを参考にテストしてみました。
上記の README.md には順序が次のように書かれていましたが、あれ?ちょっと違うんじゃね?というのと、もうちょい詳しく知りたいと思ってテスト用 Playbook を書いてテストしてみました。
- Register Variables
- Ansible assigned fact vars
- Role Dependency Parameters
- Vars file vars
- Command line extra var
- Playbook vars
- Playbook Role parameter
- Role var
- Inventory Host variable
- Inventory Group variable
- Role default variable
setup モジュールで設定される facts については ansible_ prefix が付くし、被らないかなということでテストに含めませんでした。
ちなみに、オレオレ fact を /etc/ansible/facts.d/test.fact に書くとこんな感じで読み込まれました。
{ "ansible_facts": { "ansible_local": { "test": { "test_var": "a fact var" } } } }
1.3 でのテスト結果
ansible のバージョン 1.3.2 でのテスト結果です。
$ ansible --version ansible 1.3.2
- 当該 task 中で register を使って登録した値
- コマンドラインオプションで指定した値
--extra-vars "name=value"
- (依存先 role においては meta/main.yml の dependencies 内で設定した値)
dependencies: - role: dep_role test_var: "set in dependencies"
- 依存 role の task の中で register を使って登録した値
- playbook ファイルの role 指定するところで設定した値
roles: - { role: role_name, var_name: 123}
- playbook の vars_file で指定したファイル内で設定した値
vars_file: - vars/test.yml
- playbook の vars で指定した値
vars: test_var: defined in playbook vars
- 当該 role の vars/main.yml で設定した値
- 依存 role の vars/main.yml で設定した値
- inventroy ファイルのホスト変数
[local] localhost test_var="defined in inventory:host"
複数のグループに所属するために、同一ホストが複数回登場する場合は、最後に設定された変数が有効となる
- inventory ファイルのグループ変数
[local:vars] test_var="defined in inventory:group"
- host_vars ディレクトリのホスト名ファイルで設定した値
- group_vars ディレクトリのグループ名ファイルで設定した値
(複数グループに入っている場合にどれが適用されるかは source code を読まないとわからない。後日読んでみる) - group_vars/all ファイルで設定した値
- 当該 role の defaults/main.yml で設定した値
- 依存 role の defaults/main.yml で設定した値
変数優先度のテスト結果は次の通りです。変数定義する箇所多すぎ。
1.2 でのテスト結果
1.2.2 でもテストしてみました。
$ ansible --version ansible 1.2.2
1.2 には dependencies 機能がありません。 role 内の defaults 変数も未サポートっぽい。
- 当該 task の register で登録した値
- コマンドラインオプションで設定した値
- playbook ファイルの role 指定するところで設定した値
- playbook の vars_file で指定したファイル内で設定した値
- 当該 role の vars/main.yml で設定した値
- playbook の vars で指定した値
- inventroy ファイルのホスト変数
- inventory ファイルのグループ変数
- host_vars ディレクトリのホスト名ファイルで設定した値
- group_vars ディレクトリのグループ名ファイルで設定した値
- group_vars/all ファイルで設定した値
Comments