首页 > 解决方案 > ansible根据属性合并两个列表

问题描述

我的剧本中有一个角色,它使用 set_fact 生成两个列表。这两个事实用于不同的任务。然后我需要合并它们以完成最终任务。

list1:
  - name: alice
    roles: ['role1', 'role2']
  - name: bob
    roles: ['role1']

list2:
  - name: alice
    roles: ['role3']
  - name: charlie
    roles: ['role2']

对于我的最后一项任务,我需要输出为:

list3:
  - name: alice
    roles: ['role1', 'role2', 'role3']
  - name: bob
    roles: ['role1']
  - name: charlie
    roles: ['role2']

标签: ansible

解决方案


我在评论中询问了列表与字典,因为它会对解决方案产生影响。如果您要像这样重组数据:

dict1:
  alice: ['role1', 'role2']
  bob: ['role1']

dict2:
  alice: ['role3']
  charlie: ['role2']

那么你的解决方案就变成了:

- set_fact:
    dict3: >-
      {{
      dict3|default([])|combine({
      item: (dict1[item]|default([]) + dict2[item]|default([]))|unique
      })
      }}
  loop: "{{ (dict1.keys()|list + dict2.keys()|list)|unique }}"

- debug:
    var: dict3

哪个输出:

TASK [debug] **********************************************************************************************************************************************************************************
ok: [localhost] => {
    "dict3": {
        "alice": [
            "role1", 
            "role2", 
            "role3"
        ], 
        "bob": [
            "role1"
        ], 
        "charlie": [
            "role2"
        ]
    }
}

如果您坚持使用列表,我们可以改进json_queryZeitounator 建议的解决方案:

- set_fact:
    list3: >-
      {{
      list3|default([]) + [{
      'name': item,
      'roles': (list1|json_query('[?name==`' + item + '`].roles[]') + list2|json_query('[?name==`' + item + '`].roles[]'))|unique
      }]
      }}
  loop: "{{ (list1|json_query('[].name') + list2|json_query('[].name'))|unique }}"

- debug:
    var: list3

这会产生您想要的输出:

TASK [debug] **********************************************************************************************************************************************************************************
ok: [localhost] => {
    "list3": [
        {
            "name": "alice", 
            "roles": [
                "role1", 
                "role2", 
                "role3"
            ]
        }, 
        {
            "name": "bob", 
            "roles": [
                "role1"
            ]
        }, 
        {
            "name": "charlie", 
            "roles": [
                "role2"
            ]
        }
    ]
}

推荐阅读