GitHub

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>模块及其参数(每个任务恰好一个模块),见模块参考
whenminijinja 布尔表达式,为真才执行,如 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 对所有模块生效,按模块类型选择提权方式:

模块提权方式
shellsudo /bin/sh -c <命令>
copy / templateSFTP 上传到临时文件(0600)后 sudo mv 原子落位 + chmod;幂等检测经 sudo sha256sum
filesudo mkdir -p / rm -rf / touch / chmod
fetchsudo 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 等密码来源参数即可。