fail模块是ansible中主动中断playbook执行最直接的方式,它不依赖任务报错,而是通过人为触发失败信号(如fail: msg:"...")结合when条件判断前序任务结果(如register捕获的stdout、stat.exists等)实现策略性终止,且不应设置ignore_errors:true。

在 Ansible 中,fail 模块是主动中断 playbook 执行最直接、最标准的方式。它不依赖任务报错,而是由你明确控制:满足条件就“人为失败”,触发默认的中止行为(除非设置了 ignore_errors: true)。
fail 模块的基本用法
它本身不执行系统操作,只抛出失败信号。最简写法:
-
fail:—— 使用默认错误信息 "Failed as requested from task" -
fail: msg: "数据库未就绪,停止部署"—— 自定义清晰的中止原因,便于排查
注意:msg 是唯一常用参数,无需其他配置;模块必须单独作为一个 task 出现。
结合 when 实现条件中断
真正实用的场景,是根据前序任务的结果动态决定是否中断。核心模式是:register + when + fail:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 用
register捕获上一个任务的输出或状态(如result.stdout、file_stat.stat.exists、get_url.rc) - 在
fail任务中用when判断该变量是否符合“应中止”的逻辑
示例:检查关键配置文件是否存在
- stat: path: /etc/myapp/config.yaml register: config_check
- fail: msg: "/etc/myapp/config.yaml is missing" when: not config_check.stat.exists
常见判断依据和写法
中断逻辑通常围绕这几类值展开:
-
命令输出内容:
when: result.stdout | regex_search("ERROR")或when: result.stdout == "failed" -
返回码(rc):
when: command_result.rc != 0(适用于 shell/command 模块) -
文件/路径状态:
when: not my_file.stat.exists、when: my_dir.stat.isdir == false -
变量是否定义或为空:
when: some_var is not defined、when: some_list | length == 0
与 ignore_errors 的关系
fail 模块触发的失败,同样受 ignore_errors: true 影响。如果给 fail 任务加了这个参数,它就不会中断后续任务 —— 这通常不是你想要的。所以:
- 确保
fail任务没有设置ignore_errors: true - 若需“部分跳过但关键点仍中止”,应把
ignore_errors加在前面可能失败的任务上,而把fail放在后面做兜底判断










