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

如何用单个Ansible任务根据条件拼接变量配置MikroTik交换机VLAN

用Ansible单任务实现MikroTik VLAN动态端口配置

你可以通过Ansible的过滤器组合,直接根据item.value.type中的标签动态拼接端口列表,无需拆分多个任务。核心思路是利用map+extract匹配标签对应的端口变量,再通过flatten和unique合并去重。

步骤1:定义端口变量

先在Playbook或Inventory中定义好各类端口的变量(注意把标签的横杠换成下划线,符合Ansible变量命名规范):

core_access_ports: ["ether1", "ether2"]
access_ports: ["ether3", "ether4"]
wifi_ports: ["ether5", "ether6"]
# 后续新增标签只需添加对应变量,比如iot_ports: ["ether7"]

步骤2:定义VLAN配置字典

整理你的VLAN配置,type字段存放需要关联的标签:

mikrotik_vlans:
  10:
    name: "Management"
    type: ["core-access", "access"]
  20:
    name: "User-WiFi"
    type: ["wifi"]
  30:
    name: "Server"
    type: ["core-access"]

步骤3:单任务实现动态配置

使用community.network.routeros_vlan模块(需先安装community.network集合),通过过滤器动态生成端口列表:

- name: 配置MikroTik VLAN(动态端口)
  community.network.routeros_vlan:
    vlan_id: "{{ item.key }}"
    name: "{{ item.value.name }}"
    ports: "{{ item.value.type 
                | map('replace', '-', '_') 
                | map('extract', vars, []) 
                | flatten(levels=1) 
                | unique }}"
    state: present
  loop: "{{ mikrotik_vlans | dict2items }}"

过滤器说明

  • map('replace', '-', '_'):把标签中的横杠转为下划线,匹配变量命名
  • map('extract', vars, []):根据转换后的名称从全局变量中提取端口列表,第三个参数[]是默认值,避免标签无对应变量时报错
  • flatten(levels=1):把多个端口列表合并为一个一维列表
  • unique:自动去除重复端口

这样后续新增标签时,只需添加对应的端口变量并在VLAN的type中加入标签即可,不需要修改任务代码,彻底解决维护问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 01:53:15