web-dev-qa-db-ja.com

ハッシュの変数を異なる変数ファイル間でマージする方法は?

多くのプレイブックで再利用される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
    

私たちのチームは、このソリューションを十分にエレガントであるとは考えていません。

  • Set_factやJinjaの「+」演算子を使用します

{{ list_common + list_specific }}

これには、多くのプレイブック(多くのプレイブックがあります)に変更を加える必要があり、外観も悪くなります。

-

異なるファイルのハッシュを再定義(オーバーライド)する代わりにマージする他のオプションはありますか?

私たちが達成しようとしているのは、変数ファイル間でのリストの複製を停止し、グループ/ホストに固有のパラメーターのみを定義することです。

3
Jason Holcomb

まず、リストは[1, 2, 3]そして、あなたは辞書について話します{a:1, b:2, c:3}、つまりハッシュ。

構成可能なパラメーターがあります: hash_behaviour

デフォルトではreplaceですが、mergeに設定すると、目的の動作を実現できます。

2

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から)で詳細を確認してください

0
mPrinC