Ansible:动态分配和循环列表

Ansible:动态分配和循环列表,ansible,jinja2,ansible-template,fortigate,Ansible,Jinja2,Ansible Template,Fortigate,我是Ansible的新手,尝试使用这些模块自动化Fortigate配置 我在fortios\u firewall\u addrgrp中遇到问题,特别是不支持将防火墙地址附加到组中 我在变量中设置了以下内容: 地址: 主机0: 子网:192.168.1.10/24 组:组0 主持人1: 子网:192.168.1.11/24 组:组0 主持人2: 子网:192.168.10.10/24 组别:第一组别 主持人3: 子网:192.168.10.11/24 组别:第一组别 我正在运行这个任务来生成一个

我是Ansible的新手,尝试使用这些模块自动化Fortigate配置

我在
fortios\u firewall\u addrgrp
中遇到问题,特别是不支持将防火墙地址附加到组中

我在变量中设置了以下内容:

地址:
主机0:
子网:192.168.1.10/24
组:组0
主持人1:
子网:192.168.1.11/24
组:组0
主持人2:
子网:192.168.10.10/24
组别:第一组别
主持人3:
子网:192.168.10.11/24
组别:第一组别
我正在运行这个任务来生成一个地址组

-名称:配置IPv4地址组。
fortios\u防火墙\u添加RGRP:
vdom:“{vdom}}”
国家:现在
防火墙\u addrgrp:
名称:“{item.value.group}”
成员:
-名称:“{item.key}}”
循环:“{addresses | dict2items}”
它遍历每个主机并生成一个地址组,但结果是有两个组只包含列表中最后一个主机名

理想情况下,模块应该支持将主机名追加到现有组中,但它不支持,因此我正在尝试解决这个问题,以实现以下目标:

成员:
-名称:主机0
-姓名:主持人(1)
上面的例子是可行的,但我无法预先知道变量中的组和主机名


我可以将输入变量生成或过滤到主机和组的字典中,并将其提供给成员。尽管如此,我仍然无法理解如何动态循环。

您遇到的问题与用于循环的数据结构有关。正如您所提到的,
fortios\u firewall\u addrgrp
模块需要一个代表每个主机的
成员
密钥字典列表

因此,您需要创建一个新的数据结构,以适合
fortios\u firewall\u addrgrp
模块的输入。下面是一个如何执行此操作的示例:

---
-主机:本地主机
收集事实:“不”
变量:
地址:
主机0:
子网:192.168.1.10/24
组:组0
主持人1:
子网:192.168.1.11/24
组:组0
主持人2:
子网:192.168.10.10/24
组别:第一组别
主持人3:
子网:192.168.10.11/24
组别:第一组别
任务:
-设定事实:
按组列出的地址:|
{{
地址|按|组|默认({})|组合({
item.value.group:(按组[item.value.group]寻址)|默认([])+[{“name”:item.key}]
})
}}
循环:“{addresses | dict2items}”
-名称:配置IPv4地址组。
fortios\u防火墙\u添加RGRP:
vdom:“{vdom}}”
国家:现在
防火墙\u addrgrp:
名称:“{item.key}}”
成员:“{item.value}}”
循环:“{addresses_by_group | dict2items}”
我们创建了一个名为
addresses\u by\u group
的新变量,该变量将存储每个组的主机列表。
combine
过滤器允许您组合两个不同的字典,而
default
过滤器为未定义的变量设置默认值。我们使用
+
操作符连接两个列表。如果按组调试变量
addresses\u的值,您将看到:

任务[调试]*******************************************************************
确定:[本地主机]=>
按组列出的地址:
第0组:
-名称:主机0
-姓名:主持人(1)
第一组:
-姓名:主机2
-姓名:东道主3

这正是我们需要的。请记住,我们没有触及
地址
变量,以便您以后可以使用它们。

我认为最好打开一个。回答得很好,谢谢。我一直在尝试将逻辑从Python转换为Ansible,以便按组生成地址,但实际上我无法理解如何做到这一点。过滤器就是答案!