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

能否在Ansible单个set_fact中直接计算两个列表的交集?

在Ansible Playbook中直接通过set_fact计算两列表交集

我在Ansible Playbook里用set_fact定义了两个列表:

  • list_1:从指定YAML文件读取的SAP集群列表
  • list_2:从inventory的groups中筛选出的目标组

目前已经能实现两列表的交集计算,但希望直接在第二个set_fact步骤中完成交集运算,最终得到交集结果:fas07、fas08。

原Playbook代码

- set_fact:
    list_1: "{{ ( lookup('file', '../../vars/ontap/usage2cluster.yml') | from_yaml ).sap }}"
- debug:
    msg: "{{ list_1 }}"
- set_fact:
    list_2: "{{ groups |  dict2items | selectattr('key', 'equalto', 'ontap_' + storage_stage) }}"
- debug:
    msg: "{{ list_2 }}"

已尝试的可行代码(需优化)

- set_fact:
    list_1: "{{ ( lookup('file', '../../vars/ontap/usage2cluster.yml') | from_yaml ).sap }}"
- debug:
    msg: "{{ list_1 }}"
- set_fact:
    list_2: "{{ groups |  dict2items | selectattr('key', 'equalto', 'ontap_' + storage_stage) | items2dict }}"
- debug:
    msg: "{{ list_2.values() | flatten | intersect(list_1) }}"

优化实现:直接在set_fact中生成交集

可以把交集计算逻辑直接整合到set_fact步骤里,一步得到最终结果:

- set_fact:
    list_1: "{{ ( lookup('file', '../../vars/ontap/usage2cluster.yml') | from_yaml ).sap }}"
- debug:
    msg: "{{ list_1 }}"
- set_fact:
    cluster_intersection: "{{ (groups | dict2items | selectattr('key', 'equalto', 'ontap_' + storage_stage) | items2dict).values() | flatten | intersect(list_1) }}"
- debug:
    msg: "{{ cluster_intersection }}"

逻辑说明

  1. 用items2dict把筛选后的组字典项转回字典结构
  2. 通过.values()提取组内主机列表,flatten将其处理为一维列表
  3. 直接调用intersect(list_1)计算两列表交集,结果存入cluster_intersection

如果想更进一步精简,也可以合并掉list_1的单独定义,直接在交集计算中引用文件读取逻辑:

- set_fact:
    cluster_intersection: "{{ 
        (groups | dict2items | selectattr('key', 'equalto', 'ontap_' + storage_stage) | items2dict).values() 
        | flatten 
        | intersect( (lookup('file', '../../vars/ontap/usage2cluster.yml') | from_yaml).sap )
    }}"
- debug:
    msg: "{{ cluster_intersection }}"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 06:07:25