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

Ansible中基于匹配端口合并两个列表的指定变量

在Ansible中实现网络端口数据的匹配合并

我太懂这种感受了——Python里写个嵌套循环就能轻松搞定的字段合并,到Ansible里确实得换个思路,毕竟Ansible更偏向声明式配置而非命令式代码。不过别担心,我们可以用Ansible的set_fact模块搭配内置过滤器,完美复刻你要的Python逻辑,而且效率还更高。

核心思路

先把list2转换成以port为键的字典(相当于提前做个索引),这样后续匹配端口时不用再遍历整个列表;然后遍历list1,找到对应端口的list2数据,再按需合并指定字段到新列表里。

具体Playbook实现

假设你已经通过ntc-ansible拿到了list1和list2这两个变量,直接添加下面的任务即可:

# 第一步:把list2转换成以port为键的字典,方便快速查找
- name: Transform list2 into port-indexed dictionary
  set_fact:
    list2_port_map: "{{ list2 | items2dict(key_name='port', value_name='') }}"

# 第二步:遍历list1,匹配端口并合并指定字段
- name: Merge matching port data into new list
  set_fact:
    new_list: "{{ new_list | default([]) + [ merged_port ] }}"
  loop: "{{ list1 }}"
  vars:
    # 从字典中取出当前端口对应的list2数据,无匹配则返回空字典
    matched_data: "{{ list2_port_map[item.port] | default({}) }}"
    # 按需求手动合并指定字段
    merged_port:
      port: "{{ item.port }}"
      desc: "{{ item.description }}"
      status: "{{ matched_data.status }}"
      vlan: "{{ matched_data.vlan }}"
      speed: "{{ matched_data.speed }}"
      duplex: "{{ matched_data.duplex }}"
      type: "{{ matched_data.type }}"
  # 只保留有匹配结果的条目
  when: matched_data | length > 0

效果验证

用你提供的示例数据运行后,new_list的结果会和Python代码完全一致:

[
    {
        "port": "Gi1/1",
        "desc": "Switch #1",
        "status": "connected",
        "vlan": "trunk",
        "speed": "a-1000",
        "duplex": "a-full",
        "type": "10/100/1000BaseT"
    }
]

为什么这么做?

  • 效率更高:把list2转成字典后,端口查找的时间复杂度从O(n)降到O(1),设备端口数量多的时候优势特别明显
  • 可读性更强:用Ansible原生的过滤器和声明式语法,符合Ansible的设计理念,团队里其他熟悉Ansible的人也能快速理解
  • 扩展性好:如果后续需要调整合并的字段,直接修改merged_port里的键值对就行,不用动循环逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:49:07