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

如何使用Ansible 2.4.4基于键值对合并两个哈希列表

如何在Ansible 2.4.4中基于guid合并两个哈希列表?

在Ansible 2.4.4里要基于guid合并这两个哈希列表其实不难,咱们可以用内置的过滤器和set_fact模块来实现,具体步骤如下:

示例数据

先把你给出的示例数据整理成规范的YAML格式:

foo:
  - hostname: "web1.example.com"
    guid: "73e85eb2-2ad5-4699-8a09-adf658a11ff2"
  - hostname: "web2.example.com"
    guid: "827025fe-f13c-4fc8-ba51-7ff582596bbd"
  - hostname: "web3.example.com"
    guid: "bba27304-c1bb-4889-aa44-125626be8488"

bar:
  - ipaddress: "1.1.1.1"
    guid: "73e85eb2-2ad5-4699-8a09-adf658a11ff2"
  - ipaddress: "2.2.2.2"
    guid: "827025fe-f13c-4fc8-ba51-7ff582596bbd"

解决方案

用set_fact模块结合Jinja2过滤器来实现合并,具体Playbook任务如下:

- name: 基于guid合并foo和bar列表
  set_fact:
    merged_list: >
      {% set merged = [] %}
      {% for item in foo %}
        {% set matched_ip = bar | selectattr('guid', 'equalto', item.guid) | first | default({}) %}
        {% do merged.append(item | combine(matched_ip)) %}
      {% endfor %}
      {{ merged }}

代码解释

  • 首先初始化一个空列表merged用来存放合并后的结果
  • 遍历foo中的每一个条目,针对每个条目:
    • 用selectattr过滤器从bar中筛选出guid与当前条目完全匹配的项,first取第一个匹配结果(因为guid是唯一标识,所以只会有一个)
    • default({})用来处理没有匹配项的情况(比如示例中的web3,在bar里没有对应IP,就用空字典合并,避免报错)
    • 用combine过滤器把当前foo条目和匹配到的IP条目合并,再添加到merged列表中
  • 最后把合并好的merged列表赋值给merged_list变量

合并后的结果

执行完上述任务后,merged_list的内容会是:

merged_list:
  - hostname: "web1.example.com"
    guid: "73e85eb2-2ad5-4699-8a09-adf658a11ff2"
    ipaddress: "1.1.1.1"
  - hostname: "web2.example.com"
    guid: "827025fe-f13c-4fc8-ba51-7ff582596bbd"
    ipaddress: "2.2.2.2"
  - hostname: "web3.example.com"
    guid: "bba27304-c1bb-4889-aa44-125626be8488"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:59:25