0

我是 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

上面的示例可以工作,但我无法提前知道变量中的组和主机名。

我可以将输入变量生成或过滤到主机和组的字典中,并将其提供给成员。尽管如此,我还是不明白如何动态地循环它。

4

1 回答 1

0

您遇到的问题与您用于循环的数据结构有关。正如您所提到的,该模块需要一个表示每个主机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变量,以便您以后可以使用它们。

于 2021-05-25T14:32:59.603 回答