簡體   English   中英

如何在 Ansible 劇本中使用相同的鍵合並 2 個字典

[英]How to merge 2 dict with the same key in Ansible playbook

如何合並具有相同鍵的字典?

輸入:dict1: { 'A': 'value1' }

dict2: { 'A': 'value2' }

dict3: { 'A': 'value3' }

我預期的 output: dict4: { 'A': ['value1', 'value2', 'value3'] }

如何在 Ansible 劇本中使用相同的鍵合並這些字典?

非常感謝你

map屬性並創建字典

x: "{{ {'A': [d1, d2, d3]|map(attribute='A')} }}"

, 或者使用json_query

x: "{{ [d1, d2, d3]|json_query('{A: []. A}') }}"

兩個選項給出相同的結果

x1:
  A: [value1, value2, value3]

用於測試的完整劇本示例

- hosts: localhost vars: d1: {A: value1} d2: {A: value2} d3: {A: value3} x1: "{{ {'A': [d1, d2, d3]|map(attribute='A')} }}" x2: "{{ [d1, d2, d3]|json_query('{A: []. A}') }}" tasks: - debug: var: x1|to_yaml - debug: var: x2|to_yaml

如果字典中有更多項目,例如

 d1: {A: v10, B: v11} d2: {A: v20, B: v21} d3: {A: v30, B: v31}

要么使用json_query

 x: "{{ [d1, d2, d3]|json_query('{A: []. A, B: []. B}') }}"

, 或者

a) 獲取鍵和值

_keys: "{{ d1|json_query('keys(@)') }}" _vals: "{{ [d1, d2, d3]|json_query('[].values(@)') }}"

_keys: ['A', 'B'] _vals: [['v10', 'v11'], ['v20', 'v21'], ['v30', 'v31']]

b) 轉置值

 - set_fact: trans: "{{ trans|d(_vals.0)|zip(item)|map('flatten') }}" loop: "{{ _vals[1:] }}"

trans: [[v10, v20, v30], [v11, v21, v31]]

c) 創建字典

x: "{{ dict(_keys|zip(trans)) }}"

兩個選項給出相同的結果

x: A: [v10, v20, v30] B: [v11, v21, v31]

用於測試的完整劇本示例

- hosts: localhost vars: d1: {A: v10, B: v11} d2: {A: v20, B: v21} d3: {A: v30, B: v31} x1: "{{ [d1, d2, d3]|json_query('{A: []. A, B: []. B}') }}" _keys: "{{ d1|json_query('keys(@)') }}" _vals: "{{ [d1, d2, d3]|json_query('[].values(@)') }}" x2: "{{ dict(_keys|zip(trans)) }}" tasks: - debug: msg: | _keys: {{ _keys }} _vals: {{ _vals }} - set_fact: trans: "{{ trans|d(_vals.0)|zip(item)|map('flatten') }}" loop: "{{ _vals[1:] }}" - debug: var: trans|to_yaml - debug: var: x1|to_yaml - debug: var: x2|to_yaml

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM