Ansible比对ios_facts交换机型号与自定义列表及合并循环方法咨询
Ansible 交换机型号匹配及循环优化方案
一、核心优化点
原实现中用中间文件存储型号匹配结果的逻辑可完全简化,无需额外文件IO操作,同时修正when语句的语法问题后,代码会更简洁易维护:
1. 去掉冗余的文件操作逻辑
直接通过Jinja2过滤器判断ansible_net_model是否存在于自定义型号列表中,用布尔变量存储匹配结果即可。
2. 修正when语句语法
Ansible的when条件默认处于Jinja2上下文,不需要额外嵌套{{ }},直接写变量表达式即可。
二、优化后的完整Playbook
--- # 自定义变量保持不变 vars: new_models: - name: WS-C3650-48PS #1 - name: WS-C3750X-48P #2 - name: C9200-48P #3 - name: C9200L-24P-4G #4 tasks: - name: 采集交换机硬件信息 ios_facts: gather_subset: hardware - name: 判断是否为新型号交换机 set_fact: is_new_model: "{{ ansible_net_model in new_models | map(attribute='name') | list }}" - name: 批量清空接口计数器 ios_command: commands: - command: "clear counters gigabitEthernet {{ start }}/{{ middle }}/{{ item }}" prompt: 'Clear "show interface" counters on this interface \[confirm\]' answer: 'y' loop: "{{ range(ifacefrom | int, ifaceto | int + 1) | list }}" when: is_new_model
三、循环相关问题说明
你原代码里的两个循环逻辑完全独立:一个是遍历型号列表做匹配,一个是遍历端口序列执行命令,不存在合并的必要。
如果后续你遇到需要同时遍历两个列表的场景,可以用product过滤器实现多列表合并循环,示例语法如下:
# 同时遍历list_a和list_b的所有组合 - name: 多列表合并循环示例 debug: msg: "list_a元素:{{ item.0 }}, list_b元素:{{ item.1 }}" loop: "{{ list_a | product(list_b) | list }}"
补充说明:你原代码里用
with_sequence实现的序列遍历,在新版Ansible里推荐用range过滤器配合loop实现,语法更统一,和其他循环写法保持一致。
内容的提问来源于stack exchange,提问作者Heiko
相关产品推荐
相关产品推荐

