如何用Ansible遍历host_var递增变量批量更新IOS XR的OSPF接口开销?
解决方案
最优方案:重构主机变量结构
分散的单个变量(如OSPF_INT_1、OSPF_INT_1_COST)不利于遍历和维护,建议将主机变量改为结构化列表,每个元素包含接口名和对应开销:
修改后的主机变量文件
--- ospf_interfaces: - name: Bundle-Ether1.1 cost: 5801 - name: Bundle-Ether1.2 cost: 5201 - name: Bundle-Ether1.3 cost: 5201
对应的Ansible任务
- name: 调整不符合规范的OSPF接口开销 cisco.iosxr.iosxr_config: lines: - "interface {{ item.name }} cost {{ item.cost }}" parents: router ospf 1 area 0 replace: block loop: "{{ ospf_interfaces }}"
这种方式无需担心接口数量差异,loop会自动遍历当前主机定义的所有OSPF接口,不存在未定义变量的报错问题。
兼容现有变量结构的方案
如果无法修改现有主机变量格式,可以通过变量筛选+正则匹配的方式,动态提取所有存在的接口编号并遍历:
Ansible任务
- name: 调整不符合规范的OSPF接口开销 cisco.iosxr.iosxr_config: lines: - "interface {{ hostvars[inventory_hostname]['OSPF_INT_' ~ item] }} cost {{ hostvars[inventory_hostname]['OSPF_INT_' ~ item ~ '_COST'] }}" parents: router ospf 1 area 0 replace: block loop: "{{ vars.keys() | select('match', '^OSPF_INT_\\d+$') | map('regex_replace', '^OSPF_INT_(\\d+)$', '\\1') | unique | sort }}"
逻辑说明
vars.keys():获取当前主机的所有变量名select('match', '^OSPF_INT_\\d+$'):筛选出所有以OSPF_INT_开头、后跟数字的接口名变量map('regex_replace', ...):提取变量名中的数字编号(如从OSPF_INT_3中提取3)unique | sort:去重并按编号排序,确保遍历顺序符合预期
该方案会自动忽略当前主机未定义的接口变量,避免报错。
内容的提问来源于stack exchange,提问作者dave_11
相关产品推荐
相关产品推荐

