Ansible滚动更新核心是通过serial参数控制批次、集成负载均衡器动态摘除/加入节点、封装原子性闭环操作并跨节点协调;serial支持数值、百分比或数组形式,如serial: 1逐台更新,serial: 25%按比例分批,serial: [1,3,5]阶梯式执行。

在Linux中用Ansible实现滚动更新(Rolling Update),核心是控制更新节奏、隔离节点、验证服务、再恢复流量——整个过程不依赖外部调度器,全由Ansible原生命令驱动。
明确滚动批次与顺序
使用serial参数限定每次只操作指定数量的节点,避免批量重启导致服务不可用:
- serial: 1:严格逐台更新,最安全,适合关键业务
- serial: 25%:按节点总数的25%分批,兼顾效率与冗余(如12台则每批3台)
- serial: [1, 3, 5]:自定义阶梯式批次(首台单点验证,后续逐步扩大)
该参数直接写在play顶层,例如:
- hosts: webservers
serial: 1
tasks:
- name: 停止旧服务
systemd:
name: nginx
state: stopped
集成负载均衡器动态摘除/加入
滚动更新成败关键在于流量调度。以HAProxy为例,Ansible需在每台节点更新前将其从后端池中临时下线:
- 调用haproxy模块或uri模块向HAProxy Stats API发送禁用指令
- 等待几秒(pause任务),确保连接自然断开或超时
- 更新完成后,再次调用API将节点重新启用
- 可配合wait_for模块检查新服务端口是否响应(如curl -f http://localhost:8080/health)
确保单节点更新原子性与可回退
每台节点的操作应封装为“准备→停服→部署→验证→上线”闭环:
- 用block包裹关键步骤,搭配rescue处理失败场景(如部署失败则自动拉起旧版本)
- 部署前备份配置与二进制文件(copy + backup: yes)
- 验证阶段不只是端口通,建议调用应用健康接口并解析返回码(用uri + register + failed_when)
跨节点协调与状态同步
某些升级需主从协同(如数据库主备切换),这时要用delegate_to和run_once:
- 在主库节点执行mysqldump并推送至备库(delegate_to: primary_db)
- 在备库上运行提升命令(delegate_to: standby_db)
- 所有决策类任务加run_once: true,防止多节点重复触发冲突操作
不复杂但容易忽略


















