Ansible Playbook 是可读、可测、可复用的运维契约,核心在于结构清晰、变量可控、执行可靠;任务需原子性与幂等性,变量应分层管理,Roles 与 Tags 支持模块化与精准执行,效率优化需兼顾并发与安全。

Ansible Playbook 不是脚本拼凑,而是可读、可测、可复用的运维契约。写得好,一次定义,多环境复用;写得随意,改一处崩一片。核心不在语法多复杂,而在结构是否清晰、变量是否可控、执行是否可靠。
任务设计讲原子性与幂等性
每个 task 只做一件事,且重复执行结果一致——这是 Playbook 稳定运行的底线。
- 避免把“安装+配置+启动”塞进一个 task;拆成三个独立 task,命名明确(如 Install Nginx package、Deploy nginx.conf via template、Ensure nginx service is running)
- 优先使用声明式模块(
apt、copy、service),而非shell或command,确保幂等 - 用
changed_when显式控制变更判断,比如模板渲染后仅当内容实际变动才触发 handler
变量管理重分层与可追溯
变量不是越少越好,而是越清晰越安全。按用途和作用域分层存放,避免硬编码和命令行临时覆盖滥用。
- 默认值放
defaults/main.yml,环境共性配置放group_vars/all.yml,主机特有参数放host_vars/hostname.yml - 动态加载用
include_vars,例如按环境加载config/{{ env_type }}/*.yml,支持多配置片段合并 - 运行时计算用
set_fact,但避免在循环中反复覆盖同一变量;跨 play 共享需显式通过delegate_to: localhost+run_once: true设置
结构组织靠 Roles 与 Tags
单个 playbook 快速验证可以,生产环境必须模块化。Roles 是复用基石,Tags 是执行精度保障。
- 按功能拆角色:
nginx、redis、app-deploy,每个 role 包含tasks/、templates/、vars/、defaults/和handlers/ - 在主 playbook 中用
roles:或import_role调用,支持vars覆盖和when条件启用 - 给关键任务加
tags,如install、config、restart;执行时用ansible-playbook site.yml --tags "config,restart"精准控制
执行效率与质量双保障
大规模部署不是堆高并发,而是减少冗余、规避阻塞、提前拦截问题。
- 调大
forks(如forks = 50),但结合serial: 5控制滚动更新批次,防雪崩 - 禁用无用 facts 收集:
gather_facts: false,或按需用gather_subset: !all,!min - 用
ansible-lint做 CI 阶段静态检查,拦截缩进错误、未命名 task、危险模块用法等常见缺陷

















