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

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并执行修改:

  1. 统一交换机VLAN数据:添加set_fact任务,把IOS或NXOS的VLAN数据合并到一个变量,避免后续重复判断
  2. 遍历匹配并修改:对每个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 21:50:32