playbook 中 blocks 处理异常的核心是 block(try)、rescue(except)和 always(finally)三部分:block 执行可能出错的任务,失败则跳转 rescue 做精准补救,always 保证清理动作必执行。

在 Playbook 中用 Blocks 处理异常,核心是把“可能出错的操作”放进 block,把“出错后该做什么”写进 rescue,再把“无论如何都要做的事”放进 always。它不是重试机制,而是结构化的错误应对流程。
用 block + rescue 实现精准故障响应
block 相当于 try,rescue 相当于 except——只要 block 内任一任务失败(比如命令返回非零、模块报错、文件不存在),Ansible 就立即跳过 block 剩余任务,执行 rescue 中的任务:
- rescue 中的任务默认继承 block 的权限设置(如
become: true),无需重复声明 - rescue 可包含条件判断,例如只在 CentOS 上恢复备份:
when: ansible_distribution == "CentOS" - 典型用法:部署新配置前先备份,验证失败后自动还原并重启服务
用 always 保证收尾动作不被跳过
always 块无论 block 成功、失败,还是 rescue 是否触发,都会执行。适合做不可省略的清理工作:
- 删除临时文件或目录,如
file: state=absent path=/tmp/deploy-staging - 记录操作时间戳到日志文件,便于审计追踪
- 触发 handler 刷新服务状态,确保最终系统处于一致状态
统一控制整组任务的行为参数
把共用属性提到 block 层级,避免每个 task 重复写,提升可读性和维护性:
- 限制运行环境:
when: ansible_distribution == "Ubuntu" and ansible_distribution_version == "22.04" - 统一提权:
become: true,整个 block 下所有任务自动以 root 执行 - 禁止单点失败中断流程(慎用):
ignore_errors: yes;更推荐用 rescue 做明确补救
一个实用的 Nginx 配置热更示例
涵盖准备 → 替换 → 验证 → 出错回滚 → 清理全流程:
- block 中完成配置覆盖和语法检查(
nginx -t) - rescue 中执行备份还原 +
systemctl reload nginx - always 中清除临时文件、写入部署日志











