24時間365日フルマネージドホスティングサービスのデイーネット

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

targethosts01を[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は、グループ名をアルファベット順に並べたもののうち、 最後のものが適用されるようです。

ややこしくなるので、同じ階層の複数グループには所属させない方がよさそうですね。

  • このページの先頭へ

  • 東京本社
    〒105-0001東京都港区虎ノ門2-3-22 第一秋山ビル5F
    TEL:03-3591-8887 FAX:03-3591-8886
  • 大阪本社
    〒541-0041 大阪市中央区北浜2-6-11北浜エクセルビル5F
    TEL:06-6231-8887 FAX:06-6231-8897

  • 認証範囲はこちらをご覧ください。

Denet logo

クラウドサービス・データセンタ・高機能専有サーバ・共有サーバホスティングサービス 株式会社ディーネット
dot_bar