Ansible中使用stat模块检测多文件的条件判断问题
问题分析与解决方案
你的问题出在when条件的表达式错误,导致逻辑判断失效。原表达式里的stat.exists.false是无效写法——stat.exists本身就是布尔值(true或false),不需要额外追加.false属性。
根据你的需求(所有检查的PID文件都不存在时,执行清理临时目录任务),下面是修正后的Playbook代码:
- name: Check if services were successfully stopped stat: path: "{{ item }}" loop: - /var/run/sshd.pid - /var/run/httpd.pid - /var/run/db.pid register: status_stopped - name: Clear out Axway tmp directory shell: rm -rf /var/tmp/* # 判断所有检查的文件都不存在 when: status_stopped.results | all(attribute='stat.exists', negate=True)
逻辑说明
status_stopped.results是循环任务返回的所有结果列表,每个元素对应一个文件的stat检查结果all(attribute='stat.exists', negate=True)是Ansible 2.10及以上版本支持的过滤器,作用是判断列表中所有元素的stat.exists属性都为false(即所有文件都不存在)
如果你使用的Ansible版本低于2.10,可以用以下等价写法:
when: status_stopped.results | map(attribute='stat.exists') | reject | list | length == status_stopped.results | length
map(attribute='stat.exists')提取所有文件的存在状态(布尔值列表)reject过滤掉其中为true的元素(只保留不存在的文件状态)- 最后判断过滤后的列表长度是否等于总结果长度,即所有文件都不存在
扩展:若需求是任意一个文件不存在就执行清理
如果你的实际需求是只要有一个PID文件不存在就执行清理,只需把all换成any:
when: status_stopped.results | any(attribute='stat.exists', negate=True)
内容的提问来源于stack exchange,提问作者SwiperNo
相关产品推荐
相关产品推荐

