能否在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 }}"
逻辑说明
- 用
items2dict把筛选后的组字典项转回字典结构 - 通过
.values()提取组内主机列表,flatten将其处理为一维列表 - 直接调用
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
相关产品推荐
相关产品推荐

