Ansibleでvars_filesを並べた時の変数のマージポリシー(hash_behaviour)の話で、デフォルトはreplaceなのですというお話です。
前提
以下のように
- vars/base.yml
- vars/override.yml
の順に読み込むとしましょう。
site.yml
---
- hosts: all
vars_files:
- vars/base.yml
- vars/override.yml
tasks:
- name: "でばっぐ"
debug: msg="{{ git }}"
vars/base.yml
---
git:
repo: xxx
branch: yyyy
vars/override.yml
---
git:
branch: override
デフォルトの挙動
$ ansible-playbook -i host/local test.yml
PLAY [all] ********************************************************************
GATHERING FACTS ***************************************************************
ok: [127.0.0.1]
TASK: [でばっぐ] **********************************************************
ok: [127.0.0.1] => {
"msg": "{'branch': 'override'}"
}
おやおや、 git.repo=xxxx が消されてしまいましたね。
replaceのポリシーなので、git というキーの根っこから上書きされ、 git = {branch: override} になってしまいました。
ansible.cfg に hash_behaviour=merge
を設定した場合
ansible-playbookコマンドを実行するカレントディレクトリに ansible.cfg ファイルを置いてみましょう。
ansible.cfg
[defaults]
hash_behaviour=merge
$ ansible-playbook -i host/local test.yml
PLAY [all] ********************************************************************
GATHERING FACTS ***************************************************************
ok: [127.0.0.1]
TASK: [でばっぐ] **********************************************************
ok: [127.0.0.1] => {
"msg": "{'repo': 'xxx', 'branch': 'override'}"
}
git.branch だけが上書きされましたね。
ちなみにansible.cfgファイルは次の順で探されるようです。
- カレントディレクトリ
- 環境変数の ANSIBLE_CONFIG or ~/ansible.cfg
- /etc/ansible/ansible.cfg
See:http://yteraoka.github.io/ansible-tutorial/#test-ansible