Ansible combine 只合并最后一项

Y.Y*_*.Y. 1 python ansible

我需要完成类似于Ansible, How to modify a variable during a loop? Ansible Loop 和 Update Dict,但是,我需要能够将包含列表的两个字典合并到一个字典中。一个字典存储在 group_vars 文件中,另一个存储在 host_vars 中:

组变量:

access_control:
  - source_address: "10.0.0.1/24"
    description: "Test 1"
  - source_address: "11.0.0.1/24"
    description: "Test 2"
  - source_address: "12.0.0.1/24"
    description: "Test 3"
Run Code Online (Sandbox Code Playgroud)

主机变量:

access_control_id:
  - access_id: "a01"
  - access_id: "a06"
Run Code Online (Sandbox Code Playgroud)

期望的结果是每个 access_control_id 都应用于每个 access_control 项:

"combined_access_control": [
    {
      "source_address": "10.0.0.1/24"
      "description": "Test 1"
      "access_id": "a01"
    },
    {
      "source_address": "10.0.0.1/24"
      "description": "Test 1"
      "access_id": "a06"
    },
    {
      "source_address": "11.0.0.1/24"
      "description": "Test 2"
      "access_id": "a01"
    },
    {
      "source_address": "11.0.0.1/24"
      "description": "Test 2"
      "access_id": "a06"
    },
    {
      "source_address": "12.0.0.1/24"
      "description": "Test 3"
      "access_id": "a01"
    },
    {
      "source_address": "12.0.0.1/24"
      "description": "Test 3"
      "access_id": "a06"
    },
]
Run Code Online (Sandbox Code Playgroud)

我以为我可以使用这样的东西:

- name: Combine variables into one dict
  set_fact:
    combined_access_control: "{{ combined_access_control| default ([item.1]) + [ { 'access_id': item.1.access_id } ] }}"
  loop: "{{ access_control | product (access_control_id)| list }}"
Run Code Online (Sandbox Code Playgroud)

但我只得到一个带有 access_ids 的字典:

    "combined_access_control": [
        {
            "access_id": "a01"
        },
        {
            "access_id": "a06"
        },
        {
            "access_id": "a01"
        },
        {
            "access_id": "a06"
        },
        {
            "access_id": "a01"
        },
        {
            "access_id": "a06"
        }
    ],
Run Code Online (Sandbox Code Playgroud)

sad*_*k-f 6

您需要组合列表中的 dict,并将其附加到列表中,如下所示:

    - name: Combine variables into one dict
      set_fact:
         combined_access_control: "{{ combined_access_control | default([]) + [ [] | combine (item.0) | combine ({ 'access_id': item.1.access_id }) ]}}"
      loop: "{{ access_control | product (access_control_id) | list }}"
Run Code Online (Sandbox Code Playgroud)