【RH294知识点汇总】第 4 章 《 实施任务控制 》
核心目标掌握 Ansible Playbook 的任务流程管控,核心内容是loop 循环简化重复任务、when 条件实现任务选择性执行、handler 处理程序响应主机修改触发操作,用ignore_errors/force_handlers/failed_when/changed_when和block/rescue/always处理任务失败与状态;明确Ansible 2.5 + 推荐 loop 替
目录

一、编写循环和条件判断任务
重复代码是自动化脚本的大忌,条件执行是适配不同环境的基础,循环 + 条件判断让 Playbook 更简洁、更通用。
1. 利用循环迭代任务
Ansible 2.5 版本迎来重大规范更新:官方强制推荐loop关键字,逐步废弃with_*系列老循环,这是编写现代 Ansible 代码的核心准则。
-
核心价值:消除重复任务,通过迭代大幅精简代码量;
-
循环类型:
-
简单列表循环:迭代字符串列表,通过
{{ item }}引用当前迭代值; -
字典列表循环:迭代字典对象,通过
{{ item['key'] }}获取字段值; -
循环 + register:捕获循环任务的所有执行结果,便于后续判断。
-
-
废弃的老版循环:
with_items(等效简单 loop)、with_file(遍历文件)、with_sequence(数字序列)等,新代码一律不建议使用。
2. 有条件地运行任务
通过when关键字实现任务的条件执行,仅满足逻辑条件时,当前任务才会运行。
-
版本规则:Ansible Core 2.12 起,
when中的字符串默认视为true布尔值; -
常用条件运算符:
-
值比较:
==、>、<、>=、<=、!= -
变量判断:
is defined(存在)、is not defined(不存在) -
布尔判断:直接写变量名(true)、
not 变量名(false) -
包含判断:
变量 in 列表
-
-
多条件组合:支持
and/or逻辑、列表(默认 and)、括号分组嵌套,灵活适配复杂判断场景。
3. 组合循环和有条件任务
这是实战高频用法:when条件会对 loop 的每一个迭代项单独校验,仅满足条件的项才会执行当前任务。典型场景:结合系统事实、注册变量,过滤循环内容,按需执行任务。
二、实施处理程序(Handler)
Handler 是 Ansible 中特殊的任务类型,专为「配置修改后触发服务操作」设计,是运维场景的刚需功能。
1. 核心定义
-
本质:仅被普通任务
notify通知时才会执行的任务; -
执行时机:在当前 Play 的所有普通任务执行完毕后运行;
-
触发前提:通知 Handler 的任务状态为
changed(对受管主机产生了实际修改)。
2. 核心特性(必记)
-
无论被通知多少次,最终仅执行一次;
-
严格按照
handlers块中定义的顺序执行; -
处理程序名称全局唯一,重名时仅执行第一个;
-
单个任务可同时
notify多个处理程序。
3. 典型使用场景
修改服务配置文件 → 任务触发notify → 执行 Handler 重启 / 重载服务,保证配置即时生效,是 Nginx、Docker、Kubelet 等服务配置的标准写法。
三、处理任务失败
生产环境中,任务失败不可避免,Ansible 提供了完善的失败管控机制,避免因单个任务异常导致整个 Playbook 中断,提升脚本容错性。
1. 核心定义
- 本质:仅被普通任务
notify通知时才会执行的任务; - 执行时机:在当前 Play 的所有普通任务执行完毕后运行;
- 触发前提:通知 Handler 的任务状态为
changed(对受管主机产生了实际修改)。
2. 核心特性(必记)
- 无论被通知多少次,最终仅执行一次;
- 严格按照
handlers块中定义的顺序执行; - 处理程序名称全局唯一,重名时仅执行第一个;
- 单个任务可同时
notify多个处理程序。
3. 典型使用场景
修改服务配置文件 → 任务触发notify → 执行 Handler 重启 / 重载服务,保证配置即时生效,是 Nginx、Docker、Kubelet 等服务配置的标准写法。
三、处理任务失败
生产环境中,任务失败不可避免,Ansible 提供了完善的失败管控机制,避免因单个任务异常导致整个 Playbook 中断,提升脚本容错性。
1. 默认失败规则
任务返回失败状态时,Ansible 会立即中止当前 Play 的所有后续执行,这是基础行为。
2. 任务失败管控关键字
通过关键字精细化控制单任务的失败行为,核心关键字一览:
表格
| 关键字 | 核心作用 |
|---|---|
ignore_errors: yes |
忽略当前任务失败,继续执行后续任务 |
force_handlers: yes |
即使通知任务失败,仍强制执行 Handler |
failed_when |
自定义条件,满足则标记任务为失败 |
changed_when |
自定义条件,覆盖任务的changed状态 |
3. 块(block)错误处理
Ansible 支持block/rescue/always分组语法,实现类似编程语言 try-catch-finally 的异常处理:
-
block:定义核心业务逻辑任务; -
rescue:block 中任务失败时,执行补救逻辑; -
always:无论 block 成功 / 失败,始终执行收尾逻辑。核心价值:对多任务逻辑分组,批量处理异常,大幅提升复杂 Playbook 的稳定性。
更多推荐
所有评论(0)