You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 18:30:03