Ansible循环执行列表内shell命令时item.failed条件判断报错如何解决
解决方案
错误根因
你写的changed_when: item.failed == false中item指向的是loop列表里的shell命令字符串,并非单条循环任务的执行结果,字符串类型没有failed属性,因此触发属性不存在的报错。
实现步骤
步骤1:修正检查任务写法
首先调整原任务,去掉错误的条件判断,因为检查类任务不会修改系统状态,直接将changed_when设为false即可,同时先把所有执行结果存到临时变量:
- name: Check db statuses shell: "{{ item }}" loop: - ps -fp $(pgrep -u postgres) | grep /usr/lib/postgresql - ps -fp $(pgrep -u mysql) | grep mysqld register: raw_check_results ignore_errors: yes changed_when: false
步骤2:过滤出成功的结果存入指定变量
新增set_fact任务,用Jinja2过滤器筛选出执行成功的结果,存入你需要的http变量:
- name: Filter successful results to http variable set_fact: http: "{{ raw_check_results.results | selectattr('failed', 'equalto', false) | list }}"
最终http变量中仅会保留执行成功的任务结果,失败结果会被完全过滤。
可选优化
因为你的环境中PostgreSQL和MySQL分别部署在不同服务器,命令跨服务器执行必然失败,你可以给循环项加执行条件,避免不必要的失败记录:
- name: Check db statuses shell: "{{ item.cmd }}" loop: - cmd: ps -fp $(pgrep -u postgres) | grep /usr/lib/postgresql host_group: postgresql_servers # 替换为你清单中PostgreSQL主机的分组名 - cmd: ps -fp $(pgrep -u mysql) | grep mysqld host_group: mysql_servers # 替换为你清单中MySQL主机的分组名 when: inventory_hostname in groups[item.host_group] register: raw_check_results changed_when: false
内容的提问来源于stack exchange,提问作者nephilimrising
相关产品推荐
相关产品推荐

