首页 > 解决方案 > Ansible combine 仅结合最后一项

问题描述

我需要完成类似于Ansible 的事情,如何在循环期间修改变量?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"

主机变量:

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

期望的结果是将每个 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"
    },
]

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

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

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

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

标签: pythonansible

解决方案


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

推荐阅读