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
相关产品推荐
相关产品推荐

