我正在尝试处理一个标记字典,以生成一个命令行,该命令行将传递给一个python程序,该程序将标记应用于对象。标记可以是单基数(即"键"只能在标记的元素上出现一次(或多基数(即,"键"可以在元素上出现多次(。单基数标记很好,我的问题是多基数。
ansible host_vars文件中的字典为:
multi_tags:
multi_tag1: value1
multi_tag2: mvalue1
multi_tag2: mvalue2
multi_tag3: value3
但ansible将取代";multi_tag2";用";mvalue2";只是因为不能有两个同名的变量。因此,字典实际上看起来像:
multi_tags:
multi_tag1: value1
multi_tag2: ["mvalue1", "mvalue2"]
multi_tag3: value3
最后,我需要制作以下列表:
multi_tag1:value1,multi_tag2:mvalue1,multi_tag2:mvvalue2,multi_tag 3:value3
到目前为止,我已经能够得到multi_tag1:value1,multi_tag2:[mvalue1,mvalue2],multi_ttag3:value3,并且我可以检测到mutli_tag2是一个列表,但我不知道如何提取";multi_tag2";,从multitags dict中分离出来,然后将该列表扩展为其单独的key:value组件?
注意:";multi_tag2";可以是任何名称,字典中也可以有任何数量的类似列表。挑战在于阅读字典,找到所有列表键,并将每个列表键旋转为自己的扩展键:值集。
我可以用检测和捕获列表名称密钥
- name: Caputre Lists for Processing
vars:
multilist: []
set_fact:
multilist: "{{ multilist + [item] }}"
with_items: '{{ multi_tags.keys() }}'
when: ( multi_tags[item] is defined ) and ( multi_tags[item] | type_debug == "list" )
但一旦我有了";列表列表";我不知道如何旋转它来生成/扩展每个列表中的每个键:值对,以创建最终的键:值组。
这不需要一步完成,我很乐意将扩展的key:value对添加到附加的集合事实中,然后将单个事实与";列表";事实来创建最后一个键:如果需要的话,值列表。
我已经为此绞尽脑汁好几个小时了。任何建议都会有帮助!
首先创建一个产品列表。挑战是将一个字符串转换为一个列表,其中该字符串是单个项目。简单的item|list
不起作用,因为字符串是可迭代的。因此,它必须在括号[item]
中闭合。如果项目已经是一个列表,则这将创建一个嵌套列表,该列表必须被展平,例如
- set_fact:
mtl: "{{ mtl|d([]) + [item.key]|product([item.value]|flatten) }}"
loop: "{{ multi_tags|dict2items }}"
给出
mtl:
- - multi_tag1
- value1
- - multi_tag2
- mvalue1
- - multi_tag2
- mvalue2
- - multi_tag3
- value3
然后,加入项目,例如
- debug:
msg: "{{ mtl|map('join', ':')|join(', ') }}"
给出
msg: multi_tag1:value1, multi_tag2:mvalue1, multi_tag2:mvalue2, multi_tag3:value3