こんにちは。Y.Oです。本日はgroup_varsの優先順位について書きます。
Ansibleでは色々なところで変数を定義できます。
そのうちの1つがグループごとに設定するgroup_varsですが、1つのホストに対しグループは複数設定出来るようなので、
複数グループに跨るホストの場合、どのグループのgroup_varsが適用されるのか気になり、
調べてみました。
※ 今回の内容は、同じ階層のグループ同士で跨いだ場合のお話しです。childrenを使用したグループのグループ化は含みません。
今回、調査用につぎのようなインベントリを用意しました。
/etc/ansible/fruits
[apple]
target_hosts_01 ansible_host=10.0.2.184
[kiwi]
target_hosts_01 ansible_host=10.0.2.184
[mango]
target_hosts_01 ansible_host=10.0.2.184
target_hosts_01を[apple], [kiwi], [mango]の3つのグループに所属させています。
また、group_varsには次のものを3つ用意しております。
/etc/ansible/group_vars/apple
---
fruits_name: apple
/etc/ansible/group_vars/kiwi
---
fruits_name: kiwi
/etc/ansible/group_vars/mango
---
fruits_name: mango
playbookは次のものを用意しました。
/etc/ansible/main.yml
---
- hosts: all
tasks:
- name: 変数の表示
debug: msg="変数の中身は {{ fruits_name }} です。"
それでは実行してみます。
[centos@ip-10-0-0-161 ansible]$ ansible-playbook -i fruits main.yml
PLAY [all] *************************************************************************************************************
TASK [Gathering Facts] *************************************************************************************************
ok: [target_hosts_01]
TASK [変数の表示] ***********************************************************************************************************
ok: [target_hosts_01] => {
"msg": "変数の中身は mango です。"
}
PLAY RECAP *************************************************************************************************************
target_hosts_01 : ok=2 changed=0 unreachable=0 failed=0
変数の中身はmangoでした。
インベントリに書いた最後のグループが適用されるということでしょうか?
次に、kiwiとmangoグループの記述位置を入れ替えたインベントリで実行してみます。
最後に書いたグループの変数が適用されるのであれば、今度は中身がkiwiになるはずです。
/etc/ansible/fruits2
[apple]
target_hosts_01 ansible_host=10.0.2.184
[mango]
target_hosts_01 ansible_host=10.0.2.184
[kiwi]
target_hosts_01 ansible_host=10.0.2.184
実行してみます。
[centos@ip-10-0-0-161 ansible]$ ansible-playbook -i fruits2 main.yml
PLAY [all] *************************************************************************************************************
TASK [Gathering Facts] *************************************************************************************************
ok: [target_hosts_01]
TASK [変数の表示] ***********************************************************************************************************
ok: [target_hosts_01] => {
"msg": "変数の中身は mango です。"
}
PLAY RECAP *************************************************************************************************************
target_hosts_01 : ok=2 changed=0 unreachable=0 failed=0
おや? mangoのままです。
インベントリ上のグループの記述順は関係なさそうです。
となると、グループ名をアルファベット順に並べたものの内、最後のものが選ばれているのでしょうか?
次のようにkiwiグループをplumに変更し、mangoグループよりアルファベットの順序が後ろになるよう変更してみます。
上記の推測通りであれば、変数の中身はplumになるはずです。
/etc/ansible/fruits3
[apple]
target_hosts_01 ansible_host=10.0.2.184
[plum]
target_hosts_01 ansible_host=10.0.2.184
[mango]
target_hosts_01 ansible_host=10.0.2.184
group_varsもkiwiからplumに変更します。
sudo mv /etc/ansible/group_vars/kiwi /etc/ansible/group_vars/plum
sudo vi /etc/ansible/group_vars/plum
/etc/ansible/group_vars/plum
---
fruits_name: plum
実行してみます。
[centos@ip-10-0-0-161 ansible]$ ansible-playbook -i fruits3 main.yml
PLAY [all] *************************************************************************************************************
TASK [Gathering Facts] *************************************************************************************************
ok: [target_hosts_01]
TASK [変数の表示] ***********************************************************************************************************
ok: [target_hosts_01] => {
"msg": "変数の中身は plum です。"
}
PLAY RECAP *************************************************************************************************************
target_hosts_01 : ok=2 changed=0 unreachable=0 failed=0
変数の中身がplumに変わりました。
推測通り複数グループに跨るホストの場合、group_varsは、グループ名をアルファベット順に並べたもののうち、
最後のものが適用されるようです。
ややこしくなるので、同じ階層の複数グループには所属させない方がよさそうですね。