Ansible:动态分配和循环列表
Ansible: assign and loop through list dynamically
我是 Ansible 的新手,正在尝试使用 fortinet.fortios 模块自动化 Fortigate 配置。
我遇到了 fortios_firewall_addrgrp
的问题,特别是不支持将防火墙地址附加到组。
我在我的变量中设置了这个:
addresses:
host_0:
subnet: 192.168.1.10/24
group: group_0
host_1:
subnet: 192.168.1.11/24
group: group_0
host_2:
subnet: 192.168.10.10/24
group: group_1
host_3:
subnet: 192.168.10.11/24
group: group_1
而我运行这个任务是生成一个地址组。
- name: Configure IPv4 address groups.
fortios_firewall_addrgrp:
vdom: '{{ vdom }}'
state: present
firewall_addrgrp:
name: '{{ item.value.group }}'
member:
- name: '{{ item.key }}'
loop: '{{ addresses | dict2items }}'
它遍历每个主机并生成一个地址组,但结果是有 2 个组仅包含列表中的最后一个主机名。
理想情况下,该模块应该支持将主机名附加到现有组,但它不支持,所以我正在尝试解决它以实现以下目标:
member:
- name: host_0
- name: host_1
上面的例子可行,但我无法提前知道变量中的组和主机名。
我可以将输入变量生成或过滤到主机和组的字典中,并将其提供给成员。仍然,我无法理解如何动态循环它。
您遇到的问题与您在循环中使用的数据结构有关。正如您提到的,fortios_firewall_addrgrp
模块需要 members
键的字典列表,代表每个主机。
因此,您需要创建一个适合 fortios_firewall_addrgrp
模块输入的新数据结构。以下是如何操作的示例:
---
- hosts: localhost
gather_facts: 'no'
vars:
addresses:
host_0:
subnet: 192.168.1.10/24
group: group_0
host_1:
subnet: 192.168.1.11/24
group: group_0
host_2:
subnet: 192.168.10.10/24
group: group_1
host_3:
subnet: 192.168.10.11/24
group: group_1
tasks:
- set_fact:
addresses_by_group: |
{{
addresses_by_group | default({}) | combine({
item.value.group: (addresses_by_group[item.value.group] | default([])) + [{"name": item.key}]
})
}}
loop: '{{ addresses | dict2items }}'
- name: Configure IPv4 address groups.
fortios_firewall_addrgrp:
vdom: '{{ vdom }}'
state: present
firewall_addrgrp:
name: '{{ item.key }}'
member: '{{ item.value }}'
loop: '{{ addresses_by_group | dict2items }}'
我们创建一个名为 addresses_by_group
的新变量,它将存储每个组的主机列表。 combine
过滤器允许您组合两个不同的字典,而 default
过滤器为未定义的变量设置默认值。我们使用 +
运算符连接两个列表。如果调试变量 addresses_by_group
的值,您将看到:
TASK [debug] *******************************************************************
ok: [localhost] =>
addresses_by_group:
group_0:
- name: host_0
- name: host_1
group_1:
- name: host_2
- name: host_3
这正是我们所需要的。请记住,我们没有触及 addresses
变量,以便您稍后可以使用它们。
我是 Ansible 的新手,正在尝试使用 fortinet.fortios 模块自动化 Fortigate 配置。
我遇到了 fortios_firewall_addrgrp
的问题,特别是不支持将防火墙地址附加到组。
我在我的变量中设置了这个:
addresses:
host_0:
subnet: 192.168.1.10/24
group: group_0
host_1:
subnet: 192.168.1.11/24
group: group_0
host_2:
subnet: 192.168.10.10/24
group: group_1
host_3:
subnet: 192.168.10.11/24
group: group_1
而我运行这个任务是生成一个地址组。
- name: Configure IPv4 address groups.
fortios_firewall_addrgrp:
vdom: '{{ vdom }}'
state: present
firewall_addrgrp:
name: '{{ item.value.group }}'
member:
- name: '{{ item.key }}'
loop: '{{ addresses | dict2items }}'
它遍历每个主机并生成一个地址组,但结果是有 2 个组仅包含列表中的最后一个主机名。
理想情况下,该模块应该支持将主机名附加到现有组,但它不支持,所以我正在尝试解决它以实现以下目标:
member:
- name: host_0
- name: host_1
上面的例子可行,但我无法提前知道变量中的组和主机名。
我可以将输入变量生成或过滤到主机和组的字典中,并将其提供给成员。仍然,我无法理解如何动态循环它。
您遇到的问题与您在循环中使用的数据结构有关。正如您提到的,fortios_firewall_addrgrp
模块需要 members
键的字典列表,代表每个主机。
因此,您需要创建一个适合 fortios_firewall_addrgrp
模块输入的新数据结构。以下是如何操作的示例:
---
- hosts: localhost
gather_facts: 'no'
vars:
addresses:
host_0:
subnet: 192.168.1.10/24
group: group_0
host_1:
subnet: 192.168.1.11/24
group: group_0
host_2:
subnet: 192.168.10.10/24
group: group_1
host_3:
subnet: 192.168.10.11/24
group: group_1
tasks:
- set_fact:
addresses_by_group: |
{{
addresses_by_group | default({}) | combine({
item.value.group: (addresses_by_group[item.value.group] | default([])) + [{"name": item.key}]
})
}}
loop: '{{ addresses | dict2items }}'
- name: Configure IPv4 address groups.
fortios_firewall_addrgrp:
vdom: '{{ vdom }}'
state: present
firewall_addrgrp:
name: '{{ item.key }}'
member: '{{ item.value }}'
loop: '{{ addresses_by_group | dict2items }}'
我们创建一个名为 addresses_by_group
的新变量,它将存储每个组的主机列表。 combine
过滤器允许您组合两个不同的字典,而 default
过滤器为未定义的变量设置默认值。我们使用 +
运算符连接两个列表。如果调试变量 addresses_by_group
的值,您将看到:
TASK [debug] *******************************************************************
ok: [localhost] =>
addresses_by_group:
group_0:
- name: host_0
- name: host_1
group_1:
- name: host_2
- name: host_3
这正是我们所需要的。请记住,我们没有触及 addresses
变量,以便您稍后可以使用它们。