python - ansible/jinja2 获取独特的子元素

标签 python ansible jinja2

我有一个这样的列表:

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/

相关文章:

python - 将值添加到数据框列中的最大值

python - `length` 和 `name` 排序参数不符合我的要求

php - 实现 : How to retrieve and send emails for different Gmail accounts?

Ansible local_action 在没有本地 ssh 守护进程的主机上

python - 如何在不指定库存但直接指定主机的情况下运行 Ansible?

python - 拆分和排序列表 Jinja/Pelican

python - Ansible 中的 if 语句与 Jinja2 变量

python - 将字符串转换为修改后的数字

debugging - 如何调试一般 YAML 语法错误的 ansible 没有详细信息文件并且很可能与剧本本身无关?

python - 如何更新用户输入给出的 csv 文件的字段名?