使用 rescue 与 always 实现 Try / Catch
从失败中优雅恢复
使用 rescue 与 always 实现 Try / Catch 是 CoddyKit 上的免费 DevOps Bootcamp 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 DevOps Bootcamp 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 DevOps Bootcamp 课程共包含 4 节课。
block 获得安全网
将 block 与 rescue 和 always 配对,就能为任务提供 try、catch 和 finally。失败也可以恢复。🛟
rescue 部分
如果 block 中的任何任务失败,Ansible 就会跳转到 rescue,改为运行其中的任务,就像 catch 子句一样。
- block:
- ansible.builtin.command: /opt/risky-step
rescue:
- ansible.builtin.debug:
msg: "Step failed, recovering"always 无论如何都会运行
无论 block 成功还是失败,always 部分都会运行,非常适合执行移除临时文件之类的清理工作。
- block:
- ansible.builtin.command: /opt/deploy
always:
- ansible.builtin.file:
path: /tmp/lock
state: absent三者结合
将 block、rescue 和 always 作为一个结构使用:先尝试执行工作,捕获失败,然后始终干净地完成收尾。
- block:
- ansible.builtin.command: /opt/deploy
rescue:
- ansible.builtin.debug:
msg: "Rolling back"
always:
- ansible.builtin.debug:
msg: "Done either way"rescue 会重置失败状态
如果 rescue 成功完成,该主机就不再处于失败状态。play 会继续运行,就像 block 已经成功一样。
执行顺序
任务首先在 block 中运行;如果失败,block 的其余任务会被跳过,然后启动 rescue。无论发生什么,always 都会最后运行。
当 rescue 本身失败时
如果 rescue 中的任务也失败,该主机会被标记为失败,但在 play 针对该主机停止之前,always 仍然会运行。
检查错误
在 rescue 中,您可以读取 ansible_failed_task 和 ansible_failed_result,查看哪个任务出错以及原因。
- rescue:
- ansible.builtin.debug:
msg: "Failed task was {{ ansible_failed_task.name }}"实际用法:回滚
经典模式是:在 block 中执行部署,在 rescue 中撤销更改,并在 always 中重启或解锁。每次运行都能干净地恢复。
不只是隐藏错误
rescue 用于平稳恢复,而不是让错误悄无声息。请记录失败并修复状态,不要假装什么都没有出错。⚠️
没有 rescue 就会立即停止
如果没有 rescue 部分,失败的 block 会像任何失败的任务一样:立即停止针对该主机的 play。
快速检查
下面确认一下 always 的行为。
回顾
rescue 会捕获 block 的失败并恢复主机,而 always 每次都会运行以执行清理。对于 Ansible 来说,这就是 try、catch 和 finally。✅
常见问题解答
「使用 rescue 与 always 实现 Try / Catch」课时是免费的吗?
是的 — 「使用 rescue 与 always 实现 Try / Catch」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 DevOps Bootcamp 课程的其余内容,请升级到 CoddyKit PRO。 DevOps Bootcamp 课程共包含 4 节课。
「使用 rescue 与 always 实现 Try / Catch」这节课中我会学到什么?
从失败中优雅恢复 你通过在浏览器中直接运行的动手代码来练习 DevOps Bootcamp,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 DevOps Bootcamp 需要有经验吗?
无需任何先前经验。CoddyKit 上的 DevOps Bootcamp 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「使用 rescue 与 always 实现 Try / Catch」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 DevOps Bootcamp 课中编写并运行代码吗?
能。每节 DevOps Bootcamp 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 使用 block 将任务分组
- 使用 rescue 与 always 实现 Try / Catch
- 控制失败:failed_when 与 ignore_errors
- 使用 fail 模块进行自定义断言