目录

一、编写循环和条件判断任务

1. 利用循环迭代任务

2. 有条件地运行任务

3. 组合循环和有条件任务

二、实施处理程序(Handler)

1. 核心定义

2. 核心特性(必记)

3. 典型使用场景

三、处理任务失败

1. 核心定义

2. 核心特性(必记)

3. 典型使用场景

三、处理任务失败

1. 默认失败规则

2. 任务失败管控关键字

3. 块(block)错误处理


一、编写循环和条件判断任务

重复代码是自动化脚本的大忌,条件执行是适配不同环境的基础,循环 + 条件判断让 Playbook 更简洁、更通用。

1. 利用循环迭代任务

Ansible 2.5 版本迎来重大规范更新:官方强制推荐loop关键字,逐步废弃with_*系列老循环,这是编写现代 Ansible 代码的核心准则。

  • 核心价值:消除重复任务,通过迭代大幅精简代码量;

  • 循环类型

    1. 简单列表循环:迭代字符串列表,通过{{ item }}引用当前迭代值;

    2. 字典列表循环:迭代字典对象,通过{{ item['key'] }}获取字段值;

    3. 循环 + 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. 核心特性(必记)

  1. 无论被通知多少次,最终仅执行一次

  2. 严格按照handlers块中定义的顺序执行;

  3. 处理程序名称全局唯一,重名时仅执行第一个;

  4. 单个任务可同时notify多个处理程序。

3. 典型使用场景

修改服务配置文件 → 任务触发notify → 执行 Handler 重启 / 重载服务,保证配置即时生效,是 Nginx、Docker、Kubelet 等服务配置的标准写法。

三、处理任务失败

生产环境中,任务失败不可避免,Ansible 提供了完善的失败管控机制,避免因单个任务异常导致整个 Playbook 中断,提升脚本容错性。

1. 核心定义

  • 本质:仅被普通任务notify通知时才会执行的任务;
  • 执行时机:在当前 Play 的所有普通任务执行完毕后运行;
  • 触发前提:通知 Handler 的任务状态为changed(对受管主机产生了实际修改)。

2. 核心特性(必记)

  1. 无论被通知多少次,最终仅执行一次
  2. 严格按照handlers块中定义的顺序执行;
  3. 处理程序名称全局唯一,重名时仅执行第一个;
  4. 单个任务可同时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 的稳定性。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐