【Ansible】(十四)流程控制与异常处理
目录
一、前言
二、基础错误处理机制
1. 忽略任务错误
2. 强制执行 Handler
三、自定义任务执行状态
1. 自定义失败条件 failed_when
2. 自定义变更状态 changed_when
四、高级异常处理:Block、Rescue、Always
五、知识点总结问答
1. ignore_errors 的作用是什么?
2. force_handlers 有什么意义?
3. changed_when 主要用来解决什么问题?
4. failed_when 和 ignore_errors 区别是什么?
5. Block、Rescue、Always 执行逻辑?
6. 为什么 Handler 有时候不触发?
一、前言
在 Ansible 自动化运维中,并不是所有任务都能百分百成功执行。日常部署、配置更新、服务变更过程中,经常会出现任务报错、状态误判、流程中断、需要回滚等问题。
Ansible 提供了一整套流程控制与异常处理机制,可以人为干预任务执行状态、控制报错逻辑、实现失败回滚,让 Playbook 更加稳定、健壮、适配真实生产环境。
二、基础错误处理机制
1. 忽略任务错误
Ansible 默认任务失败会直接终止整个剧本。部分检测类、非关键类任务允许失败,可以使用ignore_errors忽略报错,保证整体流程继续执行。
2. 强制执行 Handler
默认情况下,任务一旦报错,后续所有 Handler 都会被放弃执行。开启force_handlers: yes后,只要任务产生变更并 notify 过 handler,即使后面任务报错,服务重启等操作依然可以正常执行,保障业务配置生效。
三、自定义任务执行状态
Ansible 会自动判断任务是ok还是changed,我们可以手动修改判定规则。
1. 自定义失败条件 failed_when
有些命令执行返回码正常,但输出内容代表业务失败。通过failed_when可以根据输出内容手动判定任务失败,精准控制业务逻辑。
2. 自定义变更状态 changed_when
部分检查、校验命令不会修改服务器配置,却会被 Ansible 识别为变更。使用changed_when: false可以关闭 changed 状态,避免误触发服务重启。
四、高级异常处理:Block、Rescue、Always
这是 Ansible 最核心、最实用的异常容错结构,类似程序的 try-catch-finally。
- block:存放正常执行的核心任务
- rescue:当 block 内任意任务报错,自动执行回滚、修复操作
- always:无论任务成功或失败,都会执行收尾动作(重启、清理、日志记录)
常用于版本更新、配置替换、数据库变更等高风险场景,保证出错可回滚、流程可闭环。
五、知识点总结问答
1. ignore_errors 的作用是什么?
答:忽略当前任务的执行错误,任务失败不会中断整个 Playbook,保证后续流程正常执行。
2. force_handlers 有什么意义?
答:默认任务报错会终止所有 Handler 执行,开启该参数后,已触发的 Handler 依然可以执行,保证关键服务配置正常生效。
3. changed_when 主要用来解决什么问题?
答:用于手动控制任务是否产生变更,避免检测类、校验类任务误触发服务重启等操作,让剧本幂等性更强。
4. failed_when 和 ignore_errors 区别是什么?
答:ignore_errors 是放过错误,不终止流程;failed_when 是自定义错误,主动判定任务失败,用于精准业务校验。
5. Block、Rescue、Always 执行逻辑?
答:block 正常执行;block 报错则执行 rescue 回滚逻辑;always 无论成功失败都会执行,用于统一收尾。
6. 为什么 Handler 有时候不触发?
答:只有任务状态为 changed 才会触发 notify,ok、失败、跳过都不会触发;任务整体报错时,需要开启 force_handlers 才能保证 Handler 正常运行。
