首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ansible:在原始字典中创建具有重复值的反向字典

Ansible:在原始字典中创建具有重复值的反向字典
EN

Stack Overflow用户
提问于 2020-08-07 18:53:29
回答 1查看 244关注 0票数 2

我有一个Ansible字典事实vm_templates如下所示:

代码语言:javascript
复制
 {
        "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获得的结果:

代码语言:javascript
复制
 {
        "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中,我会写这样的东西:

代码语言:javascript
复制
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中尝试过的,它不起作用:

代码语言:javascript
复制
- 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到达那里的好方法

EN

回答 1

Stack Overflow用户

发布于 2020-08-08 01:23:06

下面的任务是完成这项工作。

代码语言:javascript
复制
    - 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

代码语言:javascript
复制
  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-node3

Ansible代码类似于Python。

代码语言:javascript
复制
for key in set(vm_templates.values()):
    reverse_templates[key] = [k for k,v in vm_templates.items() if v == key]
print(reverse_templates)

下面的任务产生相同的结果。

代码语言:javascript
复制
    - 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"
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63307689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档