現在、ansibleを使用してPHPをインストールするための役割を構築しています。辞書をマージするのに多少の困難があります。私がやりたいように働く:
# A vars file:
my_default_values:
key = value
my_values:
my_key = my_value
# In a playbook, I create a task to attempt merging the
# two dictionaries (which doesn't work):
- debug: msg="{{ item.key }} = {{ item.value }}"
with_dict: my_default_values + my_values
# I have also tried:
- debug: msg="{{ item.key }} = {{ item.value }}"
with_dict: my_default_values|union(my_values)
# I have /some/ success with using j2's update,
# but you can't use j2 syntax in "with_dict", it appears.
# This works:
- debug: msg="{{ my_default_values.update(my_values) }}"
# But this doesn't:
- debug: msg="{{ item.key }} = {{ item.value }}"
with_dict: my_default_values.update(my_values)
2つの辞書をマージする方法はありますか?「with_dict」で使用できますか?
Ansible 2.0には、このためのJinjaフィルター combine
があります。
- debug: msg="{{ item.key }} = {{ item.value }}"
with_dict: "{{ my_default_values | combine(my_values) }}"
ハッシュマージが必要な場合は、ansibleでハッシュマージ機能をオンにします。 ansible configファイルで ハッシュのマージをオンにする 。
と hash_behaviour = merge 同じ変数名を持つ2つのvarファイルを持つことができます:
defaults.yml:
values:
key: value
overrides.yml:
values:
my_key: my_value
2つのvarをマージするには、両方のvarファイルを含める必要があります。
ansible-playbook some-play.yml ... [email protected] [email protected]
そして、あなたはこれで終わるでしょう:
TASK: [debug var=values] ********************************************************
ok: [localhost] => {
"values": {
"key": value,
"my_key": my_value
}
}
変数の更新の呼び出しはJinjaで実行できますが、一般的には面倒です。テンプレートの外では実行せず、それを完全に回避しようとします。
YAMLのアンカーを使用して機能を拡張できるようになりました。
---
- hosts: localhost
vars:
my_default_values: &def
key: value
my_values:
<<: *def
my_key: my_value
tasks:
- debug: var=my_default_values
- debug: var=my_values
結果:
TASK [debug]
ok: [localhost] => {
"my_default_values": {
"key": "value"
}
}
TASK [debug]
ok: [localhost] => {
"my_values": {
"key": "value",
"my_key": "my_value"
}
}
これが以前に言及されなかった理由がわかりません。
マージされた辞書が数回必要な場合は、新しい「変数」に設定できます。
- set_fact: _my_values="{{ my_default_values|combine(my_values) }}"
- debug: msg="{{ item.key }} = {{ item.value }}"
with_dict: _my_values
Ansible Galaxyの この役割 を試してください。
同じ理由で少し前にやりました。いくつかのvarsファイルから辞書を深くマージし、マージのカスタム優先順位を設定できます。
この役割は、Ansible 2.0以降で機能します