一、为什么 Ansible 需要流程控制

原始笔记把 Ansible 进阶部分聚焦在“流程控制”上,核心原因很明确:真实运维任务很少只是简单顺序执行,多数时候还需要:

  • 配置变更后再重启服务
  • 根据系统类型执行不同任务
  • 对多个对象重复同一操作

这三类需求,正好分别对应:

  • handlers
  • when
  • loop / with_items

二、handlers 触发器是什么

原始笔记把 handlers 标为重点内容,并明确给出应用场景:

  • 一般用于分发配置文件
  • 如果配置发生变化,再执行重启服务等后续动作

它解决的核心问题是:

  • 避免每次执行剧本都无脑重启服务

这在配置管理中非常常见。

2.1 handlers 的基本思路

可以概括成两步:

1、在任务里埋“触发器”,也就是 notify 2、在 handlers 区块里定义真正要执行的动作

只有当对应任务状态发生变化时,handlers 才会被触发。

2.2 handlers 的典型价值

例如分发 /etc/exportsnginx.conf 这类配置文件时,如果文件没变化,就不应该反复 reload 或 restart 服务。handlers 正是为这种场景设计的。

三、when 判断是什么

原始笔记对 when 的定义是:

  • 给 task 设置执行条件
  • 满足条件才执行,不满足就跳过

这意味着,Ansible 不再是“所有主机都执行完全一样的动作”,而是可以做到:

  • CentOS 跑一套逻辑
  • Ubuntu 跑另一套逻辑

3.1 when 常和什么一起使用

原始笔记特别强调:

  • when 一般和变量一起使用
  • 常见搭配是 facts 变量或 register 变量

也就是说,先获取信息,再做判断,是 when 最常见的用法。

3.2 常见判断表达式

原始笔记中提到的典型写法包括:

  • ==
  • !=
  • (条件1) and (条件2)
  • (条件1) or (条件2)

这已经足够覆盖绝大多数基础场景。

四、loop 循环是什么

原始笔记把循环也列为重点内容,常见两类写法是:

  • with_*,例如 with_items
  • loop

从当前实践趋势看,更推荐优先掌握:

  • loop

4.1 loop 适合什么场景

原始笔记列出的应用场景非常典型:

  • 批量创建文件
  • 批量添加用户
  • 批量启动或重启服务

简单说,只要你发现多个对象要重复执行同一模块,通常就适合用循环。

五、流程控制三件套分别解决什么问题

可以用一句话概括:

  • handlers:解决“变化了才执行”
  • when:解决“满足条件才执行”
  • loop:解决“多个对象重复执行”

这三类能力叠加后,剧本的表达能力就会明显提升。

六、原始笔记中的流程控制小结很值得记住

原始笔记最后把三者做了一个简明总结:

  • handler:配置变化后执行后续动作
  • when:给模块或剧本增加条件判断
  • loop:做批量操作

如果从实战优先级来看,建议这样理解:

1、先学会用 loop 处理重复任务 2、再用 when 让剧本适配不同环境 3、最后用 handlers 避免不必要的服务重启

七、小结

Ansible 流程控制的核心,不是让剧本“更复杂”,而是让剧本“更接近真实运维逻辑”。

你可以先记住下面三点:

  • 配置分发类任务优先考虑 handlers
  • 多系统兼容类任务优先考虑 when
  • 批量重复类任务优先考虑 loop

把这三类能力真正掌握之后,剧本就不再只是“机械执行命令”,而会变成更智能的自动化工具。