ansible - 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']
解决方案
我在评论中询问了列表与字典,因为它会对解决方案产生影响。如果您要像这样重组数据:
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_query
Zeitounator 建议的解决方案:
- 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"
]
}
]
}
推荐阅读
- angular - 如何将点击事件添加到 ag-grid 中的列标题?
- javascript - 如何测试快速 GET 请求?
- nginx - Nginx 禁用覆盖主机到 http_host
- api - Facebook Marketing Api - 潜在客户重审 - 无法访问
- php - 如何在linux和windows中使用php处理文件创建和压缩
- header - PowerBI - 响应标头读取
- c# - Serilog:拆分大日志
- python-3.x - 如何让代码在 Windows 10 上的 GPU 上运行?
- c++ - 我可以在返回多个值时避免复制,同时保持我的返回类型吗?
- javascript - 我尝试将我的函数从我的第一个和第二个对象传递到新函数中,该函数接受第一个和第二个对象的参数