Ansible操作FortiGate创建地址组循环执行被覆盖如何解决
问题根因
你当前将with_items循环加在了整个任务层级,每次循环都会完整提交地址组的全量配置,member字段每次只会传入当前循环项对应的单个地址对象,因此后一次执行的配置必然覆盖前一次的结果,最终地址组只会保留最后一个子网对应的成员。
解决方案
不需要循环整个地址组创建任务,提前生成完整的成员列表后一次性提交即可,以下是两种可落地的写法:
写法1:直接通过过滤器生成成员列表(推荐,代码更简洁)
借助Jinja2过滤器直接在参数内构造符合要求的member数组,无需额外预处理任务:
- name: "addrgrp" fortios_firewall_addrgrp: vdom: "{{ vdom }}" state: "present" firewall_addrgrp: allow_routing: "disable" color: "21" comment: "try" exclude: "disable" fabric_object: "disable" member: "{{ remote_address_phase2 | map('regex_replace', '^', 'NET-') | map('community.general.dict_kv', 'name') | list }}" name: "try" type: "default"
过滤器逻辑说明:先给每个子网前缀拼接
NET-,再将每个字符串转换为{"name": "xxx"}格式的字典,最终输出符合接口要求的成员数组。
写法2:预处理生成成员变量(可读性更高)
如果不习惯复杂的过滤器写法,可以先通过set_fact预先生成成员列表:
# 第一步:预生成地址组成员列表 - name: 生成地址组成员列表 set_fact: addrgrp_members: "{{ addrgrp_members | default([]) + [{'name': 'NET-' ~ item}] }}" loop: "{{ remote_address_phase2 }}" # 第二步:一次性提交地址组配置 - name: "addrgrp" fortios_firewall_addrgrp: vdom: "{{ vdom }}" state: "present" firewall_addrgrp: allow_routing: "disable" color: "21" comment: "try" exclude: "disable" fabric_object: "disable" member: "{{ addrgrp_members }}" name: "try" type: "default"
以上两种写法都只会执行一次地址组配置提交,所有成员会一次性写入,不会出现互相覆盖的问题。
内容的提问来源于stack exchange,提问作者cava cavamagie
相关产品推荐
相关产品推荐

