如何通过ansible / jinja2中属性的存在来过滤列表?

时间:2019-07-24 09:10:28

标签: filter ansible jinja2

大家好。

我有两个类似的任务,它们在清单文件的'workernodes'组上运行:

- name: count remote files 
  find:
    paths: "{{ data_path }}"
  register: exported_files

- name: sum up number of remote files
  set_fact: 
    sum_of_exported_files: "{{ groups[ workernodes ] | map('extract', hostvars, 'exported_files') | map(attribute='matched') | sum }}"
  run_once: yes

只要所有节点都可用,此方法就可以正常工作。但是,如果find-Task计数未在任何workernode上运行,则总结任务会出错。该节点上没有export_files变量,因此到属性的映射失败。

我如何过滤已扩展的hostvars列表中export_files属性的存在?

请EnlightMe

谢谢。

2 个答案:

答案 0 :(得分:1)

如何添加此when:子句:

when: groups[ workernodes ] | map('extract', hostvars, 'exported_files')|list|first|length > 0"

答案 1 :(得分:0)

大家好,

最后,我自己找到了(真的很简单)答案:

sum_of_exported_files: "{{ groups[ workernodes ] | map('extract', hostvars, 'exported_files') | select("defined") | map(attribute='matched') | select("number") | sum }}"

感谢伊莎贝拉玛的思想,帮助我进行了深思。