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

如何用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 }}"

逻辑说明

  1. vars.keys():获取当前主机的所有变量名
  2. select('match', '^OSPF_INT_\\d+$'):筛选出所有以OSPF_INT_开头、后跟数字的接口名变量
  3. map('regex_replace', ...):提取变量名中的数字编号(如从OSPF_INT_3中提取3)
  4. unique | sort:去重并按编号排序,确保遍历顺序符合预期

该方案会自动忽略当前主机未定义的接口变量,避免报错。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 00:10:53