如何在Ansible Playbook中合并具有相同键的多个字典?
在Ansible Playbook中合并多个同键字典为列表值的字典
我需要合并多个具有相同键的字典,输入示例:
dict1: { 'A': 'value1' } dict2: { 'A': 'value2' } dict3: { 'A': 'value3' }
期望输出:
dict4: { 'A': ['value1', 'value2', 'value3'] }
请问如何在Ansible Playbook中实现?
方法1:循环收集值并构建字典
适合明确知道要合并的字典列表的场景,步骤简单直接:
- 先把要合并的字典放到一个列表里
- 循环遍历每个字典,提取目标键的值并收集到列表中
- 最后将列表赋值给目标字典的对应键
示例Playbook:
- name: 合并同键字典为列表值 hosts: localhost vars: dict1: { 'A': 'value1' } dict2: { 'A': 'value2' } dict3: { 'A': 'value3' } target_key: 'A' tasks: - name: 收集所有目标键的值 set_fact: collected_values: "{{ collected_values | default([]) + [item[target_key]] }}" loop: - "{{ dict1 }}" - "{{ dict2 }}" - "{{ dict3 }}" - name: 组装最终字典 set_fact: dict4: { "{{ target_key }}": "{{ collected_values }}" } - name: 查看结果 debug: var: dict4
方法2:用json_query批量提取值
如果要合并的字典数量较多,先把字典统一放到列表里,再用json_query一次性提取所有目标键的值,代码更简洁:
示例Playbook:
- name: 用json_query快速合并同键字典 hosts: localhost vars: dict_list: - { 'A': 'value1' } - { 'A': 'value2' } - { 'A': 'value3' } target_key: 'A' tasks: - name: 直接构建目标字典 set_fact: dict4: "{{ target_key }}": "{{ dict_list | json_query('[*].' + target_key) }}" - name: 查看结果 debug: var: dict4
扩展:处理多键合并场景
如果存在多个不同键需要合并(比如同时有键'A'和'B'),可以先提取所有唯一键,再逐个收集对应值:
示例Playbook:
- name: 合并多键字典为列表值 hosts: localhost vars: dict_list: - { 'A': 'value1', 'B': 'b1' } - { 'A': 'value2', 'B': 'b2' } - { 'A': 'value3', 'B': 'b3' } tasks: - name: 收集所有键 set_fact: all_keys: "{{ all_keys | default([]) + item.keys() | list }}" loop: "{{ dict_list }}" - name: 去重得到唯一键列表 set_fact: unique_keys: "{{ all_keys | unique }}" - name: 为每个键组装值列表 set_fact: dict4: "{{ dict4 | default({}) | combine({ item: dict_list | json_query('[*].' + item) }) }}" loop: "{{ unique_keys }}" - name: 查看结果 debug: var: dict4
内容的提问来源于stack exchange,提问作者veronicafish
相关产品推荐
相关产品推荐

