多くのプレイブックで再利用される2つのYAML変数ファイルがあります。
# playbook/group_vars/all
settings:
a: 1
b: 2
# inventory/group_vars/main.yml
settings:
c: 3
プレイブックでsettings
を{ a: 1, b: 2, c: 3 }
に等しくしたい。
代わりに、{ c: 3 }
はinventory/group_vars/*
よりも優先度が高く、ハッシュはoverriddenであり、mergedではないため、playbook/group_vars/all
と等しくなります。
次のように、ハッシュを使用する代わりに、命名規則と接頭辞を使用して、変数を個別に定義します。
# playbook/group_vars/all
settings_a: 1
settings_b: 2
# inventory/group_vars/main.yml
settings_c: 3
私たちのチームは、このソリューションを十分にエレガントであるとは考えていません。
{{ list_common + list_specific }}
これには、多くのプレイブック(多くのプレイブックがあります)に変更を加える必要があり、外観も悪くなります。
-
異なるファイルのハッシュを再定義(オーバーライド)する代わりにマージする他のオプションはありますか?
私たちが達成しようとしているのは、変数ファイル間でのリストの複製を停止し、グループ/ホストに固有のパラメーターのみを定義することです。
まず、リストは[1, 2, 3]
そして、あなたは辞書について話します{a:1, b:2, c:3}
、つまりハッシュ。
構成可能なパラメーターがあります: hash_behaviour 。
デフォルトではreplace
ですが、merge
に設定すると、目的の動作を実現できます。
Ansible v2.0以降では、次のことが可能です。
- name: merging hash_a and hash_b into hash_c
set_fact: hash_c="{{ hash_a|combine(hash_b) }}"
Ansible filters-Combining hashhes/dictionaries (Jinja2から)で詳細を確認してください