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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 00:18:03