问:Ansible-如何将2个哈希表列表与一个公用键/值对合并 [英] Q: Ansible - How can I merge 2 lists of hashes with a common key/value pair

查看:185
本文介绍了问:Ansible-如何将2个哈希表列表与一个公用键/值对合并的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何使用Ansible 2.4.4基于键/值对合并2个哈希列表

How can I merge 2 lists of hashes based on a key/value pair, using Ansible 2.4.4

"foo": [
    {
        "hostname": "web1.example.com",
        "guid": "73e85eb2-2ad5-4699-8a09-adf658a11ff2"
    },
    {
        "hostname": "web2.example.com",
        "guid": "827025fe-f13c-4fc8-ba51-7ff582596bbd"
    },
    {
        "hostname": "web3.example.com",
        "guid": "bba27304-c1bb-4889-aa44-125626be8488"
    }
]

"bar": [
    {
        "ipaddress": "1.1.1.1",
        "guid": "73e85eb2-2ad5-4699-8a09-adf658a11ff2"
    },
    {
        "ipaddress": "2.2.2.2",
        "guid": "827025fe-f13c-4fc8-ba51-7ff582596bbd"
    },
    {
        "ipaddress": "3.3.3.3",
        "guid": "bba27304-c1bb-4889-aa44-125626be8488"
    }
]

我想要类似的东西:

"foobar" : [
    {
        "hostname": "web1.example.com",
        "guid": "73e85eb2-2ad5-4699-8a09-adf658a11ff2",
        "ipaddress": "1.1.1.1"
    },
    {
        "hostname": "web2.example.com",
        "guid": "827025fe-f13c-4fc8-ba51-7ff582596bbd",
        "ipaddress": "2.2.2.2"
    },
    {
        "hostname": "web3.example.com",
        "guid": "bba27304-c1bb-4889-aa44-125626be8488",
        "ipaddress": "3.3.3.3"
    }
]

我研究了几种Ansible/Jinja2过滤器,包括合并,并集,映射,自定义插件,但收效甚微.我需要能够在GUID上进行匹配.

I've looked into several Ansible / Jinja2 filters including combine, union, map, custom plugins, but not having much success. I need to be able to match on the guid.

推荐答案

不确定是否有更聪明的方法,但是要实现所需的功能,可以使用

not sure if there is a smarter way, but to achieve what you need you can use the nested query plugin to loop over the combinations of the elements from the 2 list variables, find the combinations that have the common field equal, and then construct a new dictionary element and append it to the "final" list variable.

剧本:

- hosts: localhost
  gather_facts: false
  vars:
    foo:
      - hostname: web1.example.com
        guid: 73e85eb2-2ad5-4699-8a09-adf658a11ff2
      - hostname: web2.example.com
        guid: 827025fe-f13c-4fc8-ba51-7ff582596bbd
      - hostname: web3.example.com
        guid: bba27304-c1bb-4889-aa44-125626be8488
    bar:
      - ipaddress: 1.1.1.1
        guid: 73e85eb2-2ad5-4699-8a09-adf658a11ff2
      - ipaddress: 2.2.2.2
        guid: 827025fe-f13c-4fc8-ba51-7ff582596bbd
      - ipaddress: 3.3.3.3
        guid: bba27304-c1bb-4889-aa44-125626be8488

  tasks:

    - name: merge lists
      set_fact:
        merged_list: "{{ merged_list|default([]) + [{ 'hostname': item[0].hostname, 'guid': item[0].guid, 'ipaddress': item[1].ipaddress }] }}"
      when: "item[0].guid == item[1].guid"
      loop: "{{ query('nested', foo, bar) }}"

    - name: print results
      debug:
        var: merged_list

结果:

TASK [print results] ************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "merged_list": [
        {
            "guid": "73e85eb2-2ad5-4699-8a09-adf658a11ff2", 
            "hostname": "web1.example.com", 
            "ipaddress": "1.1.1.1"
        }, 
        {
            "guid": "827025fe-f13c-4fc8-ba51-7ff582596bbd", 
            "hostname": "web2.example.com", 
            "ipaddress": "2.2.2.2"
        }, 
        {
            "guid": "bba27304-c1bb-4889-aa44-125626be8488", 
            "hostname": "web3.example.com", 
            "ipaddress": "3.3.3.3"
        }
    ]
}

这篇关于问:Ansible-如何将2个哈希表列表与一个公用键/值对合并的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆