Ansible 如何在易读词典上反向查找?

Ansible 如何在易读词典上反向查找?,ansible,ansible-2.x,Ansible,Ansible 2.x,有没有办法将一个dict转换成另一个dict,以便根据内部字段反转查找?我希望每个项目的内部字段都是唯一的,并且始终存在。下面是我想做的一个例子 我有这样的数据结构: lookup_dict: a1: b: 123 a2: b: 456 a3: b: 789 a和b之间的映射是1对1和到。我想将其转换为: reverse_lookup_dict: 123: a1 456: a2 789: a3 因此,我可以使用b执行a的反向查找。经过一些研究,

有没有办法将一个dict转换成另一个dict,以便根据内部字段反转查找?我希望每个项目的内部字段都是唯一的,并且始终存在。下面是我想做的一个例子

我有这样的数据结构:

lookup_dict:
  a1:
    b: 123
  a2:
    b: 456
  a3:
    b: 789
a和b之间的映射是1对1和到。我想将其转换为:

reverse_lookup_dict:
  123: a1
  456: a2
  789: a3

因此,我可以使用b执行a的反向查找。

经过一些研究,我发现答案如下:

name: Reverse Lookup
set_fact:
  reverse_lookup_dict: "{{reverse_lookup_dict|default({})|combine({item.value.b: item.key})}}"
loop: "{{lookup('dict', lookup_dict)}}"

只需使用vars和dict2items+items2dict即可:

下面是一个名为forward的映射示例,它将一个愚蠢的字符串映射到一个由反向映射生成的ID,名为reverse:


我试图通过在循环中使用set_fact模块向转换的_stuff变量添加key:value对来满足您的要求。但是在每次迭代中,它都会完全覆盖变量,因此以前的key/value对丢失。您是否可以选择将转换后的内容作为单个键/值对的列表?我收到了stuff中的结构,但我需要在以后根据外部内容查找项目内容。它应该是item.value.external,感谢您分享解决方案我喜欢这样;它比我的干净。用例稍有不同,在我的forward中,值本身是一个dict,该dict的一个值将是相反的键。
reverse:
  0x0019: staff
  0x011a: visitors
  0x3bbe: executives
  0xf9c4: vpn

forward: >-
  {{ reverse 
   | dict2items 
   | items2dict(key_name="value", value_name="key" }}