我有一个Ansible字典事实vm_templates如下所示:
{
"HostedEngine": "00000000-0000-0000-0000-000000000000",
"cpu-node0": "2d826ed8-1dbe-4b10-93a1-5ac9734462cb",
"cpu-node1": "2d826ed8-1dbe-4b10-93a1-5ac9734462cb",
"cpu-node2": "2d826ed8-1dbe-4b10-93a1-5ac9734462cb",
"cpu-node3": "2d826ed8-1dbe-4b10-93a1-5ac9734462cb",
"fp_gpu-node0": "a08901c0-50a5-4e2f-b6d7-b11b69a32613",
"fp_gpu-node1": "a08901c0-50a5-4e2f-b6d7-b11b69a32613",
"fp_gpu-node10": "a08901c0-50a5-4e2f-b6d7-b11b69a32613",
"fp_gpu-node11": "a08901c0-50a5-4e2f-b6d7-b11b69a32613",
"fp_gpu-node2": "a08901c0-50a5-4e2f-b6d7-b11b69a32613",
"fp_gpu-node3": "a08901c0-50a5-4e2f-b6d7-b11b69a32613",
"fp_gpu-node4": "a08901c0-50a5-4e2f-b6d7-b11b69a32613",
"fp_gpu-node5": "a08901c0-50a5-4e2f-b6d7-b11b69a32613",
"fp_gpu-node6": "a08901c0-50a5-4e2f-b6d7-b11b69a32613",
"fp_gpu-node7": "a08901c0-50a5-4e2f-b6d7-b11b69a32613",
"fp_gpu-node8": "a08901c0-50a5-4e2f-b6d7-b11b69a32613",
"fp_gpu-node9": "a08901c0-50a5-4e2f-b6d7-b11b69a32613",
"hp_gpu-node0": "a08901c0-50a5-4e2f-b6d7-b11b69a32613",
"hp_gpu-node1": "a08901c0-50a5-4e2f-b6d7-b11b69a32613",
"hp_gpu-node2": "a08901c0-50a5-4e2f-b6d7-b11b69a32613",
"hp_gpu-node3": "a08901c0-50a5-4e2f-b6d7-b11b69a32613",
"hp_gpu-node4": "a08901c0-50a5-4e2f-b6d7-b11b69a32613",
"hp_gpu-node5": "a08901c0-50a5-4e2f-b6d7-b11b69a32613",
"hp_gpu-node6": "a08901c0-50a5-4e2f-b6d7-b11b69a32613",
"hp_gpu-node7": "a08901c0-50a5-4e2f-b6d7-b11b69a32613",
"infra-vm": "00000000-0000-0000-0000-000000000000"
}我想从上面的字典中构建一个翻转字典,同时考虑到包含重复值的键。因此,我希望将第一个字典中的每个值与其列表中的键关联起来,而旧字典中具有重复值的键将位于相同的列表值中。
下面是我试图使用ansible获得的结果:
{
"00000000-0000-0000-0000-000000000000": ["HostedEngine", "infra-vm"],
"2d826ed8-1dbe-4b10-93a1-5ac9734462cb": ["cpu-node0", "cpu-node1", "cpu-node2", "cpu-node3"],
"a08901c0-50a5-4e2f-b6d7-b11b69a32613": ["fp_gpu-node0", "fp_gpu-node1", "fp_gpu-node10", "fp_gpu-node11", "fp_gpu-node2", "fp_gpu-node3", "fp_gpu-node4", "fp_gpu-node5", "fp_gpu-node6", "fp_gpu-node7", "fp_gpu-node8", "fp_gpu-node9", "hp_gpu-node0", "hp_gpu-node1", "hp_gpu-node2", "hp_gpu-node3", "hp_gpu-node4", "hp_gpu-node5", "hp_gpu-node6", "hp_gpu-node7"]
}在python中,我会写这样的东西:
reverse_templates = {}
for key, value in vm_template.items():
if value not in reverse_templates:
reverse_templates[value] = [key]
else:
reverse_templates[value].append(key)下面是我在ansible中尝试过的,它不起作用:
- name: "Associate each template with related VMs list"
set_fact:
reverse_templates: "{{reverse_templates|default({})|combine({item.value:{% if item.value not in reverse_teplates %}value[item.key]{% else %}reverse_templates[item.value] + [item.key]{% endif %}})}}"
loop: "{{lookup('dict', vm_templates)}}"以下是错误:
将每个模板与相关的VM列表*************************************************************************************************************相关联的
任务*字符串:{{reverse_templates|default({})|combine({item.value:{%如果item.value不在reverse_teplates %}valueitem.key{% #en0# %}reverse_templatesitem.value + item.key{% endif %}“}
任何使用Ansible到达那里的好方法
发布于 2020-08-08 01:23:06
下面的任务是完成这项工作。
- set_fact:
reverse_templates: "{{ reverse_templates|default([]) +
[{item: vm_templates|
dict2items|
selectattr('value', 'eq', item)|
map(attribute='key')|
list}] }}"
loop: "{{ vm_templates.values()|unique|list }}"
- debug:
var: reverse_templates给
reverse_templates:
- a08901c0-50a5-4e2f-b6d7-b11b69a32613:
- fp_gpu-node0
- fp_gpu-node1
- fp_gpu-node10
- fp_gpu-node11
- fp_gpu-node2
- fp_gpu-node3
- fp_gpu-node4
- fp_gpu-node5
- fp_gpu-node6
- fp_gpu-node7
- fp_gpu-node8
- fp_gpu-node9
- hp_gpu-node0
- hp_gpu-node1
- hp_gpu-node2
- hp_gpu-node3
- hp_gpu-node4
- hp_gpu-node5
- hp_gpu-node6
- hp_gpu-node7
- 00000000-0000-0000-0000-000000000000:
- HostedEngine
- infra-vm
- 2d826ed8-1dbe-4b10-93a1-5ac9734462cb:
- cpu-node0
- cpu-node1
- cpu-node2
- cpu-node3Ansible代码类似于Python。
for key in set(vm_templates.values()):
reverse_templates[key] = [k for k,v in vm_templates.items() if v == key]
print(reverse_templates)下面的任务产生相同的结果。
- set_fact:
reverse_templates: "{{ reverse_templates|default([]) +
[{item: vm_templates|
dict2items|
json_query(query)}] }}"
loop: "{{ vm_templates.values()|unique|list }}"
vars:
query: "[?value == '{{ item }}'].key"https://stackoverflow.com/questions/63307689
复制相似问题