Playbook 编排
playbook 是一个 YAML 文件,由若干 play 组成;每个 play 选定一组主机, 按顺序执行 tasks。多主机间任务 lockstep 推进,语义与 Ansible 一致。
Play 结构
- name: 部署 web 服务 # 可选;play 名称
hosts: web # 必填;all / 组名 / 主机名,逗号分隔
vars: # 可选;play 级变量
release_dir: "{{ app_root }}/releases"
tasks:
- name: ...
<module>: ...Task 字段
| 字段 | 说明 |
|---|---|
<module> | 模块及其参数(每个任务恰好一个模块),见模块参考 |
when | minijinja 布尔表达式,为真才执行,如 nginx_status.rc != 0 |
register | 把执行结果存为变量,供后续任务的 when / 模板引用 |
become | 以 sudo 提权执行,对所有模块生效(详见下文) |
changed_when | 覆盖 changed 判定;表达式中用 result 引用本任务结果,或写 "false" 固定不变更 |
failed_when | 覆盖 failed 判定,如 "'ERROR' in result.stdout" |
ignore_errors | 任务失败不中断该主机的后续任务 |
执行语义
每个 play 开始时并行连接所有目标主机(-f 控制并发数)。tasks 按序 lockstep 推进:所有主机完成任务 N 才开始任务 N+1。某主机任务失败后,该主机退出本 play 的后续任务;其余主机继续。任一主机失败,进程最终以退出码 2 结束。
become 提权
become: true 对所有模块生效,按模块类型选择提权方式:
| 模块 | 提权方式 |
|---|---|
shell | sudo /bin/sh -c <命令> |
copy / template | SFTP 上传到临时文件(0600)后 sudo mv 原子落位 + chmod;幂等检测经 sudo sha256sum |
file | sudo mkdir -p / rm -rf / touch / chmod |
fetch | sudo cat(二进制安全) |
无密码 sudo 用 sudo -n;inventory 配置了 become_password 时经 stdin 喂给 sudo -S。
become 模式依赖远端为类 Unix 系统(sudo / mv / cat)。Windows 受控端请不要使用 become。
register 与条件判断
- name: 检查服务
shell: systemctl is-active nginx
register: nginx_status # 注册结果变量
changed_when: "false" # 只读检查,固定报告 ok
ignore_errors: true # 服务不存在也继续
- name: 未运行时启动
shell: systemctl start nginx
become: true
when: "nginx_status.rc != 0" # 引用注册变量shell 模块注册的变量包含 rc / stdout / stderr / failed 四个字段。
加密 playbook
playbook 同样可以整体加密后直接执行:anx vault encrypt site.yml,运行时带 --ask-vault-pass 等密码来源参数即可。