由变量集构建的Ansible循环

由变量集构建的Ansible循环,ansible,nested-loops,Ansible,Nested Loops,作为一名网络工程师,我对Ansible还很陌生,我发现它让我的大脑崩溃了。我在一些Ansible剧本中使用了基本循环。现在我正在尝试一些更复杂的东西,我确信我遗漏了一些东西,因为它感觉应该是简单的 我想在剧本中加入这些变量: vars: smb_tcp_ports: - '139' - '445' smb_udp_ports: - '137' - '138' smb_ips: - '172.16.13.130

作为一名网络工程师,我对Ansible还很陌生,我发现它让我的大脑崩溃了。我在一些Ansible剧本中使用了基本循环。现在我正在尝试一些更复杂的东西,我确信我遗漏了一些东西,因为它感觉应该是简单的

我想在剧本中加入这些变量:

  vars:
    smb_tcp_ports:
      - '139'
      - '445'
    smb_udp_ports:
      - '137'
      - '138'
    smb_ips:
      - '172.16.13.130'
      - '172.16.13.0/26'
      - '200X:8X0:fX4a:X053::/64'
      - '200X:8X0:fX4a:X050::130' 
然后循环遍历它们,这样我就构建了一个新变量,如下所示:

  vars: 
    smb_allowed_ips_tcp: 
     - { ip: "172.16.13.130", port: ['139','445'] }
     - { ip: "172.16.13.0/26", port: ['139','445'] }
     - { ip: "X001:8X0:fX4a:X053::/64", port: ['139','445'] }
     - { ip: "X001:8X0:fX4a:X050::130", port: ['139','445'] }
    smb_allowed_ips_udp:
     - { ip: "172.16.13.130", port: ['137','138'] }
     - { ip: "172.16.13.0/26", port: ['137','138'] }
     - { ip: "200X:8X0:fX4a:X053::/64", port: ['137','138'] }
     - { ip: "200X:8X0:fX4a:X050::130", port: ['137','138'] }
^^^我想要生成的上面的部分是我正在努力解决的部分^^^ 然后我可以将其发送到:

- name: Allow SMB TCP
  ufw:
    rule: allow
    src: '{{ item.0.ip }}'
    port: '{{ item.1 }}'
    proto: tcp
  with_subelements:
    - "{{ smb_allowed_ips_tcp }}"
    - port
  when: "'smbserver' in group_names"

- name: Allow SMB UDP
  ufw:
    rule: allow
    src: '{{ item.0.ip }}'
    port: '{{ item.1 }}'
    proto: udp
  with_subelements:
    - "{{ smb_allowed_ips_udp }}"
    - port
  when: "'smbserver' in group_names"
这个问题以前在这里有很多词。我把它删掉了。谢谢拉尔克斯。我希望这更清楚

我试着设定事实,但在我看到的例子中有很多我不理解的东西,比如添加符号、书写列表、产品等等,我总是以失败告终。它似乎也不作为数组添加,而是覆盖

这里回答:使用

我想我错过了收银机。因此,当我尝试寄存器事实位之前,它一直给我留下一个键值对。这没用。寄存器允许我保留所有键值并再次使用它们


现在不确定这是否是一个重复的问题

听起来您可能已经解决了您的问题,但我认为您可能对另一种实现感兴趣。我可能会使用
product
过滤器来解决这个问题,它生成两个列表的笛卡尔乘积。例如,要生成
smb\u allowed\u ips\u tcp
,我将写:

    - name: create smb_allowed_ips_tcp
      set_fact:
        smb_allowed_ips_tcp: "{{ smb_allowed_ips_tcp + [{'ip': item.0, 'port': item.1}] }}"
      loop: "{{ smb_ips|product(smb_tcp_ports)|list }}"
      vars:
        smb_allowed_ips_tcp: []
这将生成一个如下所示的数据结构:

TASK [debug] ******************************************************************************************
ok: [localhost] => {
    "smb_allowed_ips_tcp": [
        {
            "ip": "172.16.13.130",
            "port": "139"
        },
        {
            "ip": "172.16.13.130",
            "port": "445"
        },
        {
            "ip": "172.16.13.0/26",
            "port": "139"
        },
        {
            "ip": "172.16.13.0/26",
            "port": "445"
        },
        {
            "ip": "200X:8X0:fX4a:X053::/64",
            "port": "139"
        },
        {
            "ip": "200X:8X0:fX4a:X053::/64",
            "port": "445"
        },
        {
            "ip": "200X:8X0:fX4a:X050::130",
            "port": "139"
        },
        {
            "ip": "200X:8X0:fX4a:X050::130",
            "port": "445"
        }
    ]
}
我们可以将其输入
ufw
模块,如下所示:

    - name: Allow SMB TCP
      ufw:
        rule: allow
        src: '{{ item.ip }}'
        port: '{{ item.port }}'
        proto: tcp
      loop: "{{ smb_allowed_ips_tcp }}"

此解决方案所需的任务更少,而且我认为逻辑更容易遵循。

我不清楚您想要完成什么。根据
端口
选项只接受一个字符串。也许你可以详细说明你期望的规则输出是什么?我不是说模块的使用。我说的是对变量使用循环函数,我有更多的动态控制来避免重复。我将编辑以解释更多内容。谢谢。我在“好的,这就是我想看到的”之后迷路了。在那之前,我认为问题很清楚,但在读了它之后,我不清楚到底是什么问题,或者你想实现什么。我希望你能在这个问题上提供更多的关注点(可能更少的措辞)。谢谢@larsks。我想得更多。也许以上更切题?是的,看起来好多了。泰。我想当我在之前的阅读中看到“笛卡尔”这个词时,我的头脑一片空白。谷歌显示我应该早点用谷歌搜索它D
    - name: Allow SMB TCP
      ufw:
        rule: allow
        src: '{{ item.ip }}'
        port: '{{ item.port }}'
        proto: tcp
      loop: "{{ smb_allowed_ips_tcp }}"