我有一个这样的列表:
host_depends:
- host: abc
depends:
- name: item1
- name: item4
type: asdf
- name: item6
- host: def
depends:
- name: item2
- name: item4
- name: item6
我需要遍历 depends
元素的唯一名称,所以在这个例子中我想遍历
- item1
- item2
- item4
- item6
基本上是什么
debug: var=item.1.name
with_subelements:
- "{{ host_depends }}"
- depends
有,但只有独特的元素。
如何获取所有 host_depends
项目的 depends
以便我可以对它们运行 unique
过滤器并将它们与 一起使用with_items
?
编辑:
我设法获得了所有 depends
项目的列表,如下所示:
host_depends|map(attribute='depends')|list
但从那里开始,我无法将此列表缩减为 name
项。
最佳答案
如果使用 Ansible 时事情变得太复杂,而您无法围绕它进行思考,则表明不应该这样做。也许在一个循环中使用一些 Jinja 过滤器和一些 set_fact
任务是可能的。但是不要这样,Ansible 不是一种编程语言,不应该这样使用。 Ansible 有两个主要优势:可读性和可扩展性。不要因忽视后者而破坏前者。
with_subelements
其实本身就是一个插件,只是它是一个核心插件。只需复制它并创建您自己的 with_unique_subelements
插件。这是 code of with_subelements .第 100 行是将元素添加到返回列表的地方。您可以在此处 Hook 并检查该项目是否已添加。
将相对于您的剧本的修改版本保存为 lookup_plugins/unique_subelements.py
,或者如果您使用 Ansible 2,您也可以将其存储在任何角色中的相同路径中。
关于python - ansible/jinja2 获取独特的子元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36228816/