基于条件从两个列表创建Ansible字典的技术需求
基于双列表条件生成Ansible字典的实现方案
需求说明
现有两个列表:
- 列表一:存储格式为
set bgp x vlan y tags-vlan bgp z的字符串集合 - 列表二:包含四个固定元素
['f', 'j', 'h', 'm']
要实现的目标:
- 从列表一的每个字符串中提取
bgp、vlan、tags-vlan bgp对应的值,生成基础字典 - 仅当列表二的第二个元素
j与字典中tags-vlan bgp的z值均为数值且相等时,为该字典添加details键,值为列表二的第三个元素h
实现代码
- name: 生成符合条件的Ansible字典 hosts: localhost vars: # 示例列表一,可替换为实际业务数据 list_one: - "set bgp 10 vlan 20 tags-vlan bgp 30" - "set bgp 11 vlan 21 tags-vlan bgp 31" - "set bgp 12 vlan 22 tags-vlan bgp j" # z为非数值,不满足条件 # 示例列表二,j设为数值30,匹配第一个元素的z值 list_two: ["f", "30", "h", "m"] tasks: - name: 逐个处理列表元素生成目标字典 set_fact: target_dicts: "{{ target_dicts | default([]) + [item_dict] }}" loop: "{{ list_one }}" vars: # 拆分字符串提取对应字段 split_content: "{{ item.split() }}" base_dict: bgp: "{{ split_content[2] }}" vlan: "{{ split_content[4] }}" tags-vlan bgp: "{{ split_content[7] }}" # 取出列表二的关键元素 j_value: "{{ list_two[1] }}" tags_bgp_value: "{{ base_dict['tags-vlan bgp'] }}" # 判断是否满足添加details的条件 meet_condition: >- {{ tags_bgp_value is number and j_value is number and tags_bgp_value == j_value }} # 根据条件生成最终字典 item_dict: >- {{ base_dict | combine({'details': list_two[2]}) if meet_condition else base_dict }} - name: 打印最终结果 debug: var: target_dicts
关键逻辑解释
- 字段拆分:通过
split()将列表一的字符串按空格拆分为数组,按固定位置提取bgp、vlan、tags-vlan bgp的值,构建基础字典 - 条件校验:使用Ansible内置的
is number过滤器,判断两个值是否均为数值,再比对二者是否相等 - 字典合并:满足条件时用
combine过滤器为基础字典追加details键,不满足则直接使用基础字典 - 结果收集:通过循环将每个处理后的字典存入
target_dicts列表,最终统一输出结果
示例输出
符合条件的字典会包含details键:
{ "bgp": "10", "vlan": "20", "tags-vlan bgp": "30", "details": "h" }
不符合条件的元素仅保留前三个键。
内容的提问来源于stack exchange,提问作者GenZ
相关产品推荐
相关产品推荐

