使用子元素的 Ansible 双循环

Ansible double loop using subelements

我正在编写一个 Ansible 剧本,我有以下变量:

contracts:
  - name: 'https'
    subjects:
      - name: 'permit'
        filters:
          - filter: tcp_443

一个合同有多个主题,一个主题可以有多个过滤器。剧本需要遍历这个变量。

我目前正在做以下事情:

- name: Task - Contract Subjects Have Filters
  contract_subject_to_filter:
    state: "present"
    tenant: "{{ tenant }}"
    contract: "{{ item..0.name }}"
    subject: "{{ item.1.name }}"
    filter: "{{ item.2.filter }}"
  loop: "{{ contracts | subelements('subjects') | subelements('filters') }}"
  tags: contract

{"msg": "Unexpected templating type error occurred on ({{ contracts | subelements('subjects') | subelements('filters') }}): the key filters should point to a dictionary, got '({'name': 'https', 'subjects': [{'name': 'permit', 'filters': [{'filter': 'tcp_443'}]}]}, {'name': 'permit', 'filters': [{'filter': 'tcp_443'}]})'"}

如何在 Ansible 剧本中执行双循环(合同有主题,主题有过滤器)?我无法更改变量结构或使用不同的 Ansible 模块。

展开列表,例如

    - set_fact:
        my_list: "{{ _my_list|from_yaml }}"
      vars:
        _my_list: |-
          {% for i in contracts %}
          {% for j in i.subjects %}
          {% for k in j.filters %}
          - {name: {{ i.name }}, subject: {{ j.name }}, filter: {{ k.filter }}}
          {% endfor %}
          {% endfor %}
          {% endfor %}

给予

  my_list:
  - filter: tcp_443
    name: https
    subject: permit

那么,迭代是微不足道的

    - name: Task - Contract Subjects Have Filters
      debug:
        msg: |-
          state: "present"
          tenant: "tenant"
          contract: "{{ item.name }}"
          subject: "{{ item.subject }}"
          filter: "{{ item.filter }}"
      loop: "{{ my_list }}"

给予

  msg: |-
    state: "present"
    tenant: "tenant"
    contract: "https"
    subject: "permit"
    filter: "tcp_443"