如何用单个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
相关产品推荐
相关产品推荐

