基于匹配条件合并Ansible中的两个列表(含重复元素)
解决Ansible列表匹配重复元素的合并问题
问题背景
现有两个Ansible Facts列表:
- list1:包含重复数字的字符串列表
ansible_facts: list1: - "10" - "2" - "4" - "5" - "6" - "7" - "7" - "8" - "9"
- list2:数字与对应文本的二维列表,数字无重复
ansible_facts: list2: - ["10", "xxxxx"] - ["2", "yyyyy"] - ["4", "zzzzz"] - ["5", "mmmmm"] - ["6", "fffff"] - ["7", "gggggg"] - ["8", "hhhhh"] - ["9", "kkkkkk"]
需求是将list1的每个数字与list2中对应数字的文本关联,生成包含重复项的list3,即使list1有重复数字也要正确匹配。之前尝试按索引匹配的方法(when: list1[item|int] == list2[item|int])因索引不对齐无法处理重复情况。
解决方案
核心思路是先将list2转换为数字-文本映射的字典,再遍历list1的每个元素,通过字典快速查找对应文本,生成目标列表list3。
Playbook示例
- name: 合并列表并处理重复元素 hosts: localhost vars: # 模拟Ansible Facts中的列表 list1: - "10" - "2" - "4" - "5" - "6" - "7" - "7" - "8" - "9" list2: - ["10", "xxxxx"] - ["2", "yyyyy"] - ["4", "zzzzz"] - ["5", "mmmmm"] - ["6", "fffff"] - ["7", "gggggg"] - ["8", "hhhhh"] - ["9", "kkkkkk"] tasks: - name: 生成list3 set_fact: list3: "{{ list3 | default([]) + [[item, list2_dict[item]]] }}" vars: list2_dict: "{{ dict(list2) }}" loop: "{{ list1 }}" - name: 打印结果 debug: var: list3
步骤解释
- 转换list2为字典:用
dict(list2)过滤器将二维列表list2转为{"10": "xxxxx", "2": "yyyyy", ...}的字典结构,实现快速查找。 - 遍历list1生成list3:通过
loop遍历list1的每个元素,每次从字典中取出对应文本,将数字和文本组合成二维列表项,逐步追加到list3中。
执行结果
生成的list3完全符合需求:
list3: - ["10", "xxxxx"] - ["2", "yyyyy"] - ["4", "zzzzz"] - ["5", "mmmmm"] - ["6", "fffff"] - ["7", "gggggg"] - ["7", "gggggg"] - ["8", "hhhhh"] - ["9", "kkkkkk"]
内容的提问来源于stack exchange,提问作者GenZ
相关产品推荐
相关产品推荐

