ansible多阶段灰度发布核心是标签+主机组+条件判断+串行控制四者组合,分阶段聚焦检查、安装、配置等动作,用语义化标签(服务名_阶段_环境)隔离逻辑,play层统一约束,配合inventory分组与serial滚动执行。

Ansible 实现多阶段灰度发布,核心不是写一个“万能命令”,而是用 标签(tags)+ 主机组(inventory 分组)+ 条件判断(when)+ 串行控制(serial) 四者组合,把一次发布拆成可验证、可中断、可回退的多个阶段。每个阶段聚焦一件事,比如检查、安装、配置、重启、验证、回滚,彼此解耦又可联动。
分阶段打语义化标签,不写 task1/task2
避免用编号或模糊标签(如 deploy、update),改用服务名+阶段+环境组合的语义化标签:
-
service-name:如
nginx、seqgpt、redis,确保不同服务逻辑完全隔离 -
phase:如
precheck(检查磁盘/端口/依赖版本)、install(拉镜像或解压包)、config(渲染 j2 模板)、restart(滚动重启服务)、postverify(调健康接口、查日志 ERROR 行) -
env:如
canary、staging、prod,配合 inventory 中的主机组精准限定作用范围 -
rollback:显式标记回滚动作,如
restore-conf、revert-image,不依赖 always handler,防止误触发
在 Play 层统一加约束,避免任务级重复写
把安全边界设在 play 顶层,而不是每个 task 都加 when 或 tags:
- 在 play 中声明
tags: [seqgpt, canary],整段逻辑自动继承,无需逐个 task 加 tag - 关键操作加
when: inventory_hostname in groups['canary_nodes'],哪怕执行--tags seqgpt也不会波及非灰度节点 - 配合
serial: "5%"或serial: 2,让每次只更新固定比例或数量的节点,天然支持滚动式灰度
用命令行组合驱动闭环流程
一次发布分几步走,每步用不同参数组合执行,人工确认点清晰:
- 先跑预检:
ansible-playbook site.yml --tags "seqgpt,precheck,canary" -l canary_nodes - 再推配置(跳过验证):
ansible-playbook site.yml --tags "seqgpt,install,config,canary" --skip-tags postverify -l canary_nodes - 人工确认无异常后补验证:
ansible-playbook site.yml --tags "seqgpt,postverify,canary" -l canary_nodes
注意:--tags "install,config" 是 AND 关系(两个都匹配才执行),适合阶段串联;--tags install --tags config 是 OR 关系(任一匹配即执行),适合灰度中灵活调度单点动作。
配套必须做实:主机分组 + 环境变量隔离 + 失败熔断
光有 playbook 不够,基础设施得跟上:
- inventory 明确定义
[canary_nodes]和[prod_nodes],灰度节点需物理或网络隔离,不能和生产混跑 - 用
group_vars/canary_nodes/单独设置模型路径、日志级别、超时阈值等变量,和group_vars/prod/完全分开 - 关键任务加
ignore_errors: no+any_errors_fatal: true,任一节点失败立即中断整个批次,不继续往下推











