Ansible联合收割机仅合并最后一项

2024-05-22 09:36:50 发布

您现在位置:Python中文网/ 问答频道 /正文

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

组变量:

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"

主机变量:

access_control_id:
  - access_id: "a01"
  - access_id: "a06"

期望的结果是每个访问控制id应用于每个访问控制项:

"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"
    },
]

我想我可以用这样的东西:

- 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 }}"

但我只得到一本带有访问ID的词典:

    "combined_access_control": [
        {
            "access_id": "a01"
        },
        {
            "access_id": "a06"
        },
        {
            "access_id": "a01"
        },
        {
            "access_id": "a06"
        },
        {
            "access_id": "a01"
        },
        {
            "access_id": "a06"
        }
    ],

Tags: testloopidsourceaccessaddressdescriptionansible
1条回答
网友
1楼 · 发布于 2024-05-22 09:36:50

您需要合并列表中的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 }}"

相关问题 更多 >