Ansible Playbook vs Ad-Hoc
下面是一份 Ansible Playbook vs Ad-Hoc 的详细对比、适用场景、生产最佳实践、常见误区。
非常适合构建 Ansible 自动化体系时使用。
| 项目 | Ad-Hoc | Playbook |
|---|---|---|
| 用途 | 临时命令 / 快速操作 | 长期维护 / 可重复的配置管理 |
| 场景 | 临时批量执行命令、查看状态、修改单个配置 | 系统部署、应用部署、运维流程自动化、持续交付 |
| 适合 | 运维工程师的日常行政命令 | 团队协作 / 可版本化 / CI/CD |
| 优势 | 快速、无文件、简单 | 可复用、结构化、依赖管理、幂等可靠 |
| 缺点 | 不可维护、不可回滚、无幂等性 | 写起来相对复杂 |
Ad-Hoc = 一条临时命令即可完成一次性任务
无需 Playbook、无需文件,适用于 短平快操作。
ansible all -m ping
ansible web -a "uptime"
ansible db -a "df -h"
ansible web -m setup
ansible all -m shell -a "ps aux | grep nginx"
ansible all -m lineinfile -a "path=/etc/sysctl.conf line='net.ipv4.ip_forward = 1'"
ansible web -m copy -a "src=a.conf dest=/etc/a.conf"
ansible web -m service -a "name=nginx state=restarted"
- 临时关掉服务
- 临时删除文件/清理日志
- 临时加监控
一次性、无副作用操作——适合 ad-hoc
危险操作、重操作——不要 ad-hoc!
可模拟执行:
ansible web -m lineinfile -a "... " --check
ansible all -m shell -a "systemctl restart nginx" --limit web1
千台服务器执行:
ansible all -a "rm -rf /tmp/*"
❌ 这是最常见的事故
务必限制:
ansible all -a "rm -rf /tmp/*" --limit 'app-&prod' --check
一条只能做一件事
如果需要流程 -> playbook
Playbook = 可重复的自动化蓝图
适合:固定流程、复杂操作、系统部署、持续交付、环境一致性管理。
包含安装 -> 配置 -> 启动 -> 检查 -> 回滚完整流程
从拉代码到重启服务全自动
需要多步流程的统一版本控制
Playbook 反复执行不会出错(ad-hoc 不具备)
GitLab、Jenkins 都依赖 Playbook
不要把逻辑散落在多个 playbook 中。
结构化:
roles/
nginx/
tasks/
templates/
files/
handlers/
❌ 错误:
- shell: "systemctl restart nginx"
✅ 正确:
- service:
name: nginx
state: restarted
Playbook 不包含变量,这是可维护性关键。
ansible-playbook site.yml --tags "deploy"
ansible-playbook site.yml --check --diff
确保重复执行不会破坏系统。
✅ 适合
- 批量命令
- 一次性任务
- 临时的、无副作用的小操作
- 查看信息、调试、批量检查
- 服务器上线前的快速验证
❌ 不适合部署、业务逻辑、长流程
✅ 适合
- 正式部署流程
- 大型业务系统上线
- 多步流程
- 配置管理
- 应用发布
- 多环境管理
- 固定任务周期
- 安装、配置、日志、监控、限流、恢复
❌ 不适合快速零碎的小任务
- 只有 1 步 -> Ad-Hoc
- 多于 3 步 -> Playbook
- 将来需要重复执行 -> Playbook
- 影响面大(生产环境) -> Playbook
- 实时操作 + 紧急处理 -> Ad-Hoc(但需谨慎)
结果:无版本控制、难以重复执行、容易误操作。
不要把 playbook 当成 shell 集合。
生产绝不能这样做,应使用 inventory + 变量。
写成:
- shell: "echo 1 >> file"
导致重复执行追加多次。
Ad-Hoc:
- 用于临时命令、一次性维护、批量检查、快速操作
- 不适合复杂流程
- 最佳实践:限制范围、启用 check、谨慎执行
Playbook:
- 用于可重复的自动化流程:部署、升级、配置管理、CI/CD
- 强调幂等性、结构化、版本化、模块化、可重复
- 最佳实践:使用 Roles、使用模块、handlers、加 diff/check、CI 审核