Ansible failed_when配置异常:指定stderr内容未阻止任务失败
你的failed_when语句存在两个关键问题,导致不符合预期行为:
1. 逻辑运算符使用错误
你期望的是:当stderr包含指定的两个字符串之一时,任务不失败,反过来就是:只有当stderr有内容,且两个字符串都不在stderr里时,任务才标记失败。
原表达式中使用了or,导致只要其中一个字符串不在stderr中,条件就成立,任务就会失败。比如当前场景中,stderr包含have a resource type,但不包含the object has been modified,or条件会返回true,结合前面的stderr_lines | length > 0,最终failed_when_result为true,任务被标记失败。
2. 字符串匹配时多余的单引号
原表达式里的字符串被额外的单引号包裹(比如"'the object has been modified'"),这会让Ansible去匹配包含单引号的完整字符串,但实际stderr中的错误信息并没有单引号,导致匹配永远不成立,进一步加剧了逻辑错误。
修正后的任务配置
将failed_when条件修改为以下两种方式之一即可:
方式一:明确判断两个字符串都不存在
- name: List nodes delegate_to: localhost shell: kubectl get nodes run_once: true register: output_error failed_when: (output_error.stderr_lines | length > 0) and ("the object has been modified" not in output_error.stderr) and ("have a resource type" not in output_error.stderr)
方式二:用not包裹“存在任一字符串”的条件(更贴合需求语义)
- name: List nodes delegate_to: localhost shell: kubectl get nodes run_once: true register: output_error failed_when: (output_error.stderr_lines | length > 0) and not (("the object has been modified" in output_error.stderr) or ("have a resource type" in output_error.stderr))
验证修正效果
针对你提供的错误场景:stderr: "error: the server doesn't have a resource type \"nodes\""
修正后的条件会判断出"have a resource type" in output_error.stderr为true,因此not (...)部分为false,整个failed_when条件结果为false,任务不会被标记失败,符合你的预期。
内容的提问来源于stack exchange,提问作者user3580316

