serial 参数实现滚动发布,通过分批执行Play控制批次节奏:支持固定数、百分比、列表序列及与max_fail_percentage熔断组合,且serial值不可超过forks。

用 serial 参数做滚动发布,核心是让 Ansible 分批执行 Play,而不是一次性打满所有节点,从而避免服务中断。它不改变全局并发能力(那是 forks 的事),而是精准控制单个 Play 内部的“批次节奏”。
serial 的基本用法和常见设置
在 Play 中直接指定 serial,就能启用滚动模式:
-
serial: 3:每次只对 3 台主机运行整个 Play(所有任务依次执行完),再处理下一批 -
serial: "20%":按当前匹配主机总数的 20% 向下取整,比如 17 台主机 → 每批 3 台 -
serial: [1, 5, 10]:首批评 1 台,第二批 5 台,之后每批 10 台,直到全部覆盖 -
serial: [1, "10%", "100%"]:混合写法,灵活适配不同规模阶段
配合 max_fail_percentage 防止故障扩散
滚动发布时,若某一批次出错,默认会继续下一批,可能掩盖问题。加 max_fail_percentage 可主动熔断:
-
serial: "25%"+max_fail_percentage: 25:每批 4 台,只要其中 1 台失败(即超 25%),整个 Play 立即中止 - 这个组合特别适合前端或 API 层——第一批验证通过再放量,比全量回滚成本低得多
与 forks 的关系别搞混
forks 是 Ansible 整体能同时连多少台机器(默认 5),而 serial 是“每次允许多少台进同一个 Play”。两者关系是:
-
serial值不能超过forks;设forks=10却写serial=20,实际仍按 10 执行 - 生产环境常调高
forks(如设为 50),但关键服务更新仍用小serial(如 1 或 3)保稳 - 推荐做法:
forks在ansible.cfg全局设高,serial在具体 Play 中按需设低
真实部署中的典型写法示例
比如更新 Web 集群,希望“一台验证、五台扩量、其余全上”,且任意批次失败率超 10% 就停:
- name: Rolling deploy nginx
hosts: webservers
serial:
- 1
- 5
- "100%"
max_fail_percentage: 10
become: yes
tasks:
- name: Copy new config
copy:
src: files/nginx.conf
dest: /etc/nginx/nginx.conf
backup: yes
<pre class="brush:php;toolbar:false;">- name: Test config and reload
systemd:
name: nginx
state: reloaded
daemon_reload: yes
这样既控制节奏,又保留快速反馈和安全边界。


















