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

基于条件从两个列表创建Ansible字典的技术需求

基于双列表条件生成Ansible字典的实现方案

需求说明

现有两个列表:

  • 列表一:存储格式为set bgp x vlan y tags-vlan bgp z的字符串集合
  • 列表二:包含四个固定元素['f', 'j', 'h', 'm']

要实现的目标:

  1. 从列表一的每个字符串中提取bgp、vlan、tags-vlan bgp对应的值,生成基础字典
  2. 仅当列表二的第二个元素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

关键逻辑解释

  1. 字段拆分:通过split()将列表一的字符串按空格拆分为数组,按固定位置提取bgp、vlan、tags-vlan bgp的值,构建基础字典
  2. 条件校验:使用Ansible内置的is number过滤器,判断两个值是否均为数值,再比对二者是否相等
  3. 字典合并:满足条件时用combine过滤器为基础字典追加details键,不满足则直接使用基础字典
  4. 结果收集:通过循环将每个处理后的字典存入target_dicts列表,最终统一输出结果

示例输出

符合条件的字典会包含details键:

{
    "bgp": "10",
    "vlan": "20",
    "tags-vlan bgp": "30",
    "details": "h"
}

不符合条件的元素仅保留前三个键。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 06:20:24