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

Ansible如何解析嵌套字典列表提取各交换机VLAN ID生成新列表?

提取Ansible嵌套字典中的VLAN ID并生成目标列表

给定嵌套结构的tor_vlan_list变量,我们可以通过Ansible的循环与过滤器组合,生成你需要的new_list,并将其用于后续执行show vlan {{item}}命令。

步骤1:生成目标格式的new_list

通过set_fact结合循环,逐台提取交换机的VLAN ID并整理:

# 初始化空列表
- name: Initialize new_list
  set_fact:
    new_list: []

# 遍历每台交换机的条目,提取VLAN ID
- name: Extract VLAN IDs for each switch
  set_fact:
    new_list: "{{ new_list + [ { switch_name: vlan_ids } ] }}"
  loop: "{{ tor_vlan_list }}"
  vars:
    # 获取当前交换机的名称(每个列表元素是单key字典)
    switch_name: "{{ item.keys() | first }}"
    # 获取该交换机下所有VLAN的详情字典
    vlan_details: "{{ item[switch_name] }}"
    # 提取每个VLAN的id字段并转为整数,组成列表
    vlan_ids: "{{ vlan_details.values() | map(attribute='id') | map('int') | list }}"

# 可选:验证生成的new_list结构
- name: Print new_list
  debug:
    var: new_list

执行后生成的new_list将完全符合你要求的格式:

"new_list": [
    { 
     "switch_01": [1,10,20,30]
    },
    {
     "switch_02": [1,10,20,30]
    }
]

步骤2:将new_list用于执行show vlan命令

可以通过嵌套循环,针对每台交换机的每个VLAN执行命令:

- name: Execute show vlan for each VLAN per switch
  loop: "{{ new_list }}"
  vars:
    switch_name: "{{ item.keys() | first }}"
    vlan_list: "{{ item[switch_name] }}"
  block:
    - name: Run show vlan command on {{ switch_name }}
      command: "show vlan {{ vlan_id }}"
      loop: "{{ vlan_list }}"
      vars:
        vlan_id: "{{ item }}"
      # 根据交换机名称指定执行目标设备
      delegate_to: "{{ switch_name }}"

备选方案:用json_query直接生成

如果偏好使用json_query,可以通过JMESPath表达式一次性生成目标列表:

- name: Generate new_list with json_query
  set_fact:
    new_list: "{{ tor_vlan_list | json_query('[].{ (keys(@)[0]): values(@)[0].*.id | map(&to_number(@)) }') }}"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 23:17:03