Ansible 複数グループに所属するホストのgroup_vars優先順位

こんにちは。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は、グループ名をアルファベット順に並べたもののうち、
最後のものが適用されるようです。
ややこしくなるので、同じ階層の複数グループには所属させない方がよさそうですね。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA