Ansible实现交换机VLAN名称与FortiGate别名同步的问题
问题:通过Ansible同步交换机VLAN名称与FortiGate别名
我正在用Ansible遍历一批交换机,检查它们是否包含FortiGate防火墙中的VLAN,并将交换机上对应VLAN的name字段修改为FortiGate的alias字段。目前代码能判断交换机中存在匹配的VLAN,但不知道如何定位具体VLAN并完成修改。
现有代码
--- - name: Sync VLAN names according to FortiGate alias hosts: test_switches, fortigate gather_facts: false connection: ansible.netcommon.network_cli tasks: # 获取FortiGate中带别名的VLAN信息 - name: Gather information from Fortigate delegate_to: fortigate connection: httpapi fortinet.fortios.fortios_configuration_fact: filters: - vlanid!=0 - alias!="" formatters: - name - alias - vlanid - ip sorters: - vlanid selector: system_interface register: out vars: ansible_httpapi_use_ssl: yes ansible_httpapi_validate_certs: no ansible_httpapi_port: 443 vdom: "root" run_once: true # 获取IOS交换机VLAN信息 - name: Gather IOS switch VLANs cisco.ios.ios_vlans: state: gathered when: ansible_network_os == "cisco.ios.ios" register: vlanIOS # 获取NXOS交换机VLAN信息 - name: Gather NXOS switch VLANs cisco.nxos.nxos_vlans: state: gathered when: ansible_network_os == "cisco.nxos.nxos" register: vlanNXOS
数据示例
FortiGate返回的VLAN数据
{ "alias": "STREAMING_SRVS", "ip": "10.112.81.1 255.255.255.192", "name": "DMZ_01", "q_origin_key": "DMZ_01", "vlanid": 781 }
交换机返回的VLAN数据
{ "mtu": 1500, "name": "default", "shutdown": "disabled", "state": "active", "vlan_id": 1 }
解决方案
要实现定位并修改匹配的VLAN,需要先统一交换机的VLAN数据,再遍历FortiGate的VLAN列表,找到对应交换机上的VLAN并执行修改:
- 统一交换机VLAN数据:添加
set_fact任务,把IOS或NXOS的VLAN数据合并到一个变量,避免后续重复判断 - 遍历匹配并修改:对每个FortiGate的VLAN,过滤出交换机上对应ID的VLAN,调用对应模块修改名称
添加以下任务替换原来的debug任务:
# 统一交换机VLAN数据到一个变量 - name: Unify switch VLAN data set_fact: switch_vlans: "{{ vlanIOS.gathered | default(vlanNXOS.gathered) }}" when: ansible_network_os in ["cisco.ios.ios", "cisco.nxos.nxos"] # 处理IOS交换机的VLAN名称更新 - name: Update VLAN name to match FortiGate alias (IOS) cisco.ios.ios_vlans: config: - vlan_id: "{{ item.vlanid }}" name: "{{ item.alias }}" state: merged debug: msg: "Updated VLAN {{ item.vlanid }}: name changed from {{ matching_vlan.name }} to {{ item.alias }}" when: - ansible_network_os == "cisco.ios.ios" - matching_vlan is defined - matching_vlan.name != item.alias vars: # 过滤出当前交换机中匹配VLAN ID的条目 matching_vlan: "{{ switch_vlans | selectattr('vlan_id', 'equalto', item.vlanid) | first | default(None) }}" loop: "{{ hostvars['fortigate'].out.meta.results }}" # 处理NXOS交换机的VLAN名称更新 - name: Update VLAN name to match FortiGate alias (NXOS) cisco.nxos.nxos_vlans: config: - vlan_id: "{{ item.vlanid }}" name: "{{ item.alias }}" state: merged debug: msg: "Updated VLAN {{ item.vlanid }}: name changed from {{ matching_vlan.name }} to {{ item.alias }}" when: - ansible_network_os == "cisco.nxos.nxos" - matching_vlan is defined - matching_vlan.name != item.alias vars: matching_vlan: "{{ switch_vlans | selectattr('vlan_id', 'equalto', item.vlanid) | first | default(None) }}" loop: "{{ hostvars['fortigate'].out.meta.results }}"
关键说明
switch_vlans变量:统一存储当前交换机的VLAN数据,兼容IOS和NXOS两种设备类型matching_vlan:用selectattr过滤出与FortiGate VLAN ID匹配的交换机VLAN,first取第一个匹配项,default(None)避免无匹配时报错- 条件判断:仅当VLAN存在且名称不一致时执行修改,避免不必要的配置变更
- 分设备类型处理:IOS和NXOS的VLAN模块参数逻辑一致,但分开编写更清晰,避免跨模块兼容问题
内容的提问来源于stack exchange,提问作者Neiker45
相关产品推荐
相关产品推荐

