Ansible合并列表词典

Ansible合并列表词典,ansible,Ansible,我目前正在构建一个Ansible playbook,它为我提供以下两个变量。我需要将它们合并到一个变量中,其中IPAddress匹配,如下例所示 --- - hosts: localhost gather_facts: no vars: sites: - siteGroupId: 123 siteName: name123 siteDevices: - ipAddress: 1.1.1.1

我目前正在构建一个Ansible playbook,它为我提供以下两个变量。我需要将它们合并到一个变量中,其中IPAddress匹配,如下例所示

---
- hosts: localhost
  gather_facts: no
  vars:
    sites:
        - siteGroupId: 123
          siteName: name123
          siteDevices:
            - ipAddress: 1.1.1.1
            - ipAddress: 2.2.2.2
        - siteGroupId: 456
          siteName: name456
          siteDevices:
            - ipAddress: 3.3.3.3
            - ipAddress: 4.4.4.4

    devices:
        - ipAddress: 1.1.1.1
          deviceName: name123-a.tld
        - ipAddress: 2.2.2.2
          deviceName: name123-b.tld
        - ipAddress: 3.3.3.3
          deviceName: name456-a.tld
        - ipAddress: 4.4.4.4
          deviceName: name456-b.tld
预期产出:

sites:
    - siteGroupId: 123
        siteName: name123
        siteDevices:
            - ipAddress: 1.1.1.1
              deviceName: name123-a.tld
            - ipAddress: 2.2.2.2
              deviceName: name123-b.tld
    - siteGroupId: 456
        siteName: name456
        siteDevices:
            - ipAddress: 3.3.3.3
              deviceName: name456-a.tld
            - ipAddress: 4.4.4.4
              deviceName: name456-b.tld
到目前为止,我使用下面的代码成功地将名称添加到站点,但得到了4个站点(重复的siteGroupID作为输出)

输出:

        {
            "siteDevices": [
                {
                    "deviceName": "name123-a.tld", 
                    "ipAddress": "1.1.1.1"
                }
            ], 
            "siteGroupId": 123, 
            "siteName": "name123"
        }, 
        {
            "siteDevices": [
                {
                    "deviceName": "name123-b.tld", 
                    "ipAddress": "2.2.2.2"
                }
            ], 
            "siteGroupId": 123, 
            "siteName": "name123"
        },
        {
            "siteDevices": [
                {
                    "deviceName": "name456-a.tld", 
                    "ipAddress": "3.3.3.3"
                }
            ], 
            "siteGroupId": 456, 
            "siteName": "name456"
        }, 
        {
            "siteDevices": [
                {
                    "deviceName": "name456-b.tld", 
                    "ipAddress": "4.4.4.4"
                }
            ], 
            "siteGroupId": 456, 
            "siteName": "name456"
        }

任务

    - set_fact:
        devices_dict: "{{ devices|
                          items2dict(key_name='ipAddress',
                                     value_name='deviceName') }}"
    - set_fact:
        sites2: "{{ sites2|default([]) + [
                    item|
                    combine({'siteDevices':
                             dict(my_ipAddress|
                                  zip(my_ipAddress|
                                      map('extract', devices_dict)))|
                             dict2items(key_name='ipAddress',
                                        value_name='deviceName')})] }}"
      vars:
        my_ipAddress: "{{ item.siteDevices|json_query('[].ipAddress') }}"
      loop: "{{ sites }}"
    - debug:
        var: sites2
给予

任务

    - set_fact:
        devices_dict: "{{ devices|
                          items2dict(key_name='ipAddress',
                                     value_name='deviceName') }}"
    - set_fact:
        sites2: "{{ sites2|default([]) + [
                    item|
                    combine({'siteDevices':
                             dict(my_ipAddress|
                                  zip(my_ipAddress|
                                      map('extract', devices_dict)))|
                             dict2items(key_name='ipAddress',
                                        value_name='deviceName')})] }}"
      vars:
        my_ipAddress: "{{ item.siteDevices|json_query('[].ipAddress') }}"
      loop: "{{ sites }}"
    - debug:
        var: sites2
给予


非常感谢你!这正是我想要的。非常感谢!这正是我想要的。
    "sites2": [
        {
            "siteDevices": [
                {
                    "deviceName": "name123-a.tld", 
                    "ipAddress": "1.1.1.1"
                }, 
                {
                    "deviceName": "name123-b.tld", 
                    "ipAddress": "2.2.2.2"
                }
            ], 
            "siteGroupId": 123, 
            "siteName": "name123"
        }, 
        {
            "siteDevices": [
                {
                    "deviceName": "name456-a.tld", 
                    "ipAddress": "3.3.3.3"
                }, 
                {
                    "deviceName": "name456-b.tld", 
                    "ipAddress": "4.4.4.4"
                }
            ], 
            "siteGroupId": 456, 
            "siteName": "name456"
        }
    ]