You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ansible教程:如何合并字典列表?

Ansible 合并字典列表为单字典用于API调用

需求:将一组字典列表合并为单个字典,仅Host字段值不同,需将所有Host值合并为列表,其余字段取最后一个字典的对应值。

输入示例

[
    {
        "Batch_number": "Batch1",
        "Date": "20221228",
        "Host": "Host1",
        "Job_Template_ID": 7,
        "Patch_Cycle": 30,
        "Patch_Day": "Day1",
        "RRule": "INTERVAL=1;COUNT=1;FREQ=MINUTELY",
        "Recurrency": "Once",
        "Start_Time": "17:00:00",
        "Technical_Tower": "Unix",
        "Timezone": "Asia/Culcutta"
    },
    {
        "Batch_number": "Batch1",
        "Date": "20221230",
        "Host": "Host11",
        "Job_Template_ID": 7,
        "Patch_Cycle": 30,
        "Patch_Day": "Day2",
        "RRule": "INTERVAL=1;COUNT=1;FREQ=MINUTELY",
        "Recurrency": "Once",
        "Start_Time": "17:00:00",
        "Technical_Tower": "Unix",
        "Timezone": "Asia/Culcutta"
    },
    {
        "Batch_number": "Batch1",
        "Date": "20230101",
        "Host": "Host21",
        "Job_Template_ID": 7,
        "Patch_Cycle": 30,
        "Patch_Day": "Day3",
        "RRule": "INTERVAL=1;COUNT=1;FREQ=MINUTELY",
        "Recurrency": "Once",
        "Start_Time": "17:00:00",
        "Technical_Tower": "Unix",
        "Timezone": "Asia/Culcutta"
    },
    {
        "Batch_number": "Batch1",
        "Date": "20230103",
        "Host": "Host31",
        "Job_Template_ID": 7,
        "Patch_Cycle": 30,
        "Patch_Day": "Day4",
        "RRule": "INTERVAL=1;COUNT=1;FREQ=MINUTELY",
        "Recurrency": "Once",
        "Start_Time": "17:00:00",
        "Technical_Tower": "Unix",
        "Timezone": "Asia/Culcutta"
    }
]

预期输出

{
    "Batch_number": "Batch1",
    "Date": "20230103",
    "Host": ["Host1","Host11","Host21","Host31"],
    "Job_Template_ID": 7,
    "Patch_Cycle": 30,
    "Patch_Day": "Day4",
    "RRule": "INTERVAL=1;COUNT=1;FREQ=MINUTELY",
    "Recurrency": "Once",
    "Start_Time": "17:00:00",
    "Technical_Tower": "Unix",
    "Timezone": "Asia/Culcutta"
}

实现方案

通过Ansible的set_fact结合过滤器完成合并:

- name: 合并字典列表为单字典
  hosts: localhost
  vars:
    input_list:
      [
        {
            "Batch_number": "Batch1",
            "Date": "20221228",
            "Host": "Host1",
            "Job_Template_ID": 7,
            "Patch_Cycle": 30,
            "Patch_Day": "Day1",
            "RRule": "INTERVAL=1;COUNT=1;FREQ=MINUTELY",
            "Recurrency": "Once",
            "Start_Time": "17:00:00",
            "Technical_Tower": "Unix",
            "Timezone": "Asia/Culcutta"
        },
        {
            "Batch_number": "Batch1",
            "Date": "20221230",
            "Host": "Host11",
            "Job_Template_ID": 7,
            "Patch_Cycle": 30,
            "Patch_Day": "Day2",
            "RRule": "INTERVAL=1;COUNT=1;FREQ=MINUTELY",
            "Recurrency": "Once",
            "Start_Time": "17:00:00",
            "Technical_Tower": "Unix",
            "Timezone": "Asia/Culcutta"
        },
        {
            "Batch_number": "Batch1",
            "Date": "20230101",
            "Host": "Host21",
            "Job_Template_ID": 7,
            "Patch_Cycle": 30,
            "Patch_Day": "Day3",
            "RRule": "INTERVAL=1;COUNT=1;FREQ=MINUTELY",
            "Recurrency": "Once",
            "Start_Time": "17:00:00",
            "Technical_Tower": "Unix",
            "Timezone": "Asia/Culcutta"
        },
        {
            "Batch_number": "Batch1",
            "Date": "20230103",
            "Host": "Host31",
            "Job_Template_ID": 7,
            "Patch_Cycle": 30,
            "Patch_Day": "Day4",
            "RRule": "INTERVAL=1;COUNT=1;FREQ=MINUTELY",
            "Recurrency": "Once",
            "Start_Time": "17:00:00",
            "Technical_Tower": "Unix",
            "Timezone": "Asia/Culcutta"
        }
      ]
  tasks:
    - name: 提取所有Host值组成列表
      set_fact:
        host_list: "{{ input_list | map(attribute='Host') | list }}"

    - name: 以最后一个字典为基础合并生成目标字典
      set_fact:
        merged_dict: "{{ input_list[-1] | combine({'Host': host_list}) }}"

    - name: 输出合并后的结果
      debug:
        var: merged_dict

逻辑说明

  1. 使用map(attribute='Host')过滤器从输入列表的每个字典中提取Host值,再转为列表;
  2. 取输入列表的最后一个字典input_list[-1]作为基础结构;
  3. 用combine方法将基础字典的Host字段替换为合并后的host_list,得到最终的目标字典。

内容的提问来源于stack exchange,提问作者Koushik Padmanaban

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 08:35:25