Ansible:双循环进入 json 文件

Ansible : double loop into json file

我有一个包含块和数据列表的 json 文件作为源。我想从中提取信息以创建安全规则,使用 ansible 中的双循环。

下面是我的 json 文件中的示例:

[
   {
      "Name":"Some_name",
      "NetworkFlow":[
         {
            "GroupName":"Test1",
            "Type":"Ingress",
            "Env":"dev",
            "Server":[
               "192.168.1.1",
               "192.168.1.2",
               ...
            ],
            "Service":[
               {
                  "Protocol":"TCP",
                  "Port":"443"
               },
               {
                  "Protocol":"UDP",
                  "Port":"21"
               },
               ....
            ]
         },
         ....
      ]
   }
]

这是针对一般部署的,对于每个“NetworkFlow”部分,我必须在服务器列表以及协议和端口列表中循环以获得如下所示的模拟解析:

#rule= Server,Protocol,Port,Type,Env,GroupName
192.168.1.1,TCP,443,Ingress,Dev,Test1
192.168.1.2,TCP,443,Ingress,Dev,Test1
192.168.1.1,UDP,21,Ingress,Dev,Test1
192.168.1.2,UDP,21,Ingress,Dev,Test1

我尝试了 with_nested 但它不起作用,请问有什么解决办法吗?

创建一个带有嵌套循环的文件,例如

shell> cat rules.yml
- debug:
    msg: "{{ item.0 }},{{ item.1.Protocol }},{{ item.1.Port }},{{ outer_item.Type }},{{ outer_item.Env }},{{ outer_item.GroupName }}"
  with_nested:
    - "{{ outer_item.Server }}"
    - "{{ outer_item.Service }}"

并包含它

    - include_tasks: rules.yml
      loop: "{{ NetworkFlow }}"
      loop_control:
        loop_var: outer_item

给予

  msg: 192.168.1.1,TCP,443,Ingress,dev,Test1
  msg: 192.168.1.1,UDP,21,Ingress,dev,Test1
  msg: 192.168.1.2,TCP,443,Ingress,dev,Test1
  msg: 192.168.1.2,UDP,21,Ingress,dev,Test1

问:"...有一个用逗号分隔的端口列表,而不仅仅是一个端口。"

A:转换数据。例如

shell> cat rules.yml
- set_fact:
    Services: "{{ Services|from_yaml }}"
  vars:
    Services: |
      {% for service in oi.Service %}
      {% for port in service.Port.split(',') %}
        - Protocol: {{ service.Protocol }}
          Port: {{ port }}
      {% endfor %}
      {% endfor %}

- debug:
    msg: "{{ i.0 }},{{ i.1.Protocol }},{{ i.1.Port }},{{ oi.Type }},{{ oi.Env }},{{ oi.GroupName }}"
  with_nested:
    - "{{ oi.Server }}"
    - "{{ Services }}"
  loop_control:
    loop_var: I

给予

  msg: 192.168.1.1,TCP,443,Ingress,dev,Test1
  msg: 192.168.1.1,TCP,22,Ingress,dev,Test1
  msg: 192.168.1.1,TCP,53,Ingress,dev,Test1
  msg: 192.168.1.1,UDP,21,Ingress,dev,Test1
  msg: 192.168.1.2,TCP,443,Ingress,dev,Test1
  msg: 192.168.1.2,TCP,22,Ingress,dev,Test1
  msg: 192.168.1.2,TCP,53,Ingress,dev,Test1
  msg: 192.168.1.2,UDP,21,Ingress,dev,Test1