web-dev-qa-db-ja.com

辞書をansibleにマージする

現在、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」で使用できますか?

41
Berry Langerak

Ansible 2.0には、このためのJinjaフィルター combine があります。

- debug: msg="{{ item.key }} = {{ item.value }}"
  with_dict: "{{ my_default_values | combine(my_values) }}"
68
augurar

ハッシュマージが必要な場合は、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で実行できますが、一般的には面倒です。テンプレートの外では実行せず、それを完全に回避しようとします。

11
jarv

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"
    }
}

これが以前に言及されなかった理由がわかりません。

6
leiiv

マージされた辞書が数回必要な場合は、新しい「変数」に設定できます。

- set_fact: _my_values="{{ my_default_values|combine(my_values) }}"

- debug: msg="{{ item.key }} = {{ item.value }}"
  with_dict: _my_values
3
Nat

Ansible Galaxyの この役割 を試してください。

同じ理由で少し前にやりました。いくつかのvarsファイルから辞書を深くマージし、マージのカスタム優先順位を設定できます。

この役割は、Ansible 2.0以降で機能します

1
eugene0707