Ansible Playbook 是 YAML 格式的自动化脚本,核心作用是将多步运维任务(如安装软件、配置文件、启动服务)编排成可重复执行的 "自动化流程"。其结构遵循固定的层级逻辑,从基础到进阶可拆解为「YAML 基础规范 + Play 核心结构 + 进阶组件」三部分,以下结合实操示例详细说明:
一、先掌握:Playbook 的 YAML 基础(必守规则)
Playbook 基于 YAML 编写,YAML 的语法规则直接决定 Playbook 是否能正常执行,核心规则:
- 缩进:用 2 个空格缩进(禁止用 Tab),层级靠缩进区分(最核心!);
- 列表项 :用
-开头表示一个列表元素(比如一个 Play、一个任务); - 键值对 :用
key: value格式(冒号后必须加空格); - 字符串:简单字符串可不用引号,含特殊字符(如空格、*)需用单 / 双引号包裹;
- 注释 :用
#开头,注释内容不会执行。
二、Playbook 的核心结构(从基础到进阶)
一个 Playbook 由 一个或多个 Play 组成,每个 Play 对应 "对一组主机执行一系列任务"。单个 Play 的核心结构如下(按优先级 / 常用度排序):
| 核心元素 | 作用 | 示例 |
|---|---|---|
hosts |
必选!指定要操作的主机 / 组(对应 Inventory 里的分组 / IP) | hosts: webservers / all |
remote_user |
远程执行任务的用户(通常是 root) | remote_user: root |
become/become_user |
提权(普通用户 sudo 到 root) | become: yes + become_user: root |
vars |
自定义变量(可在任务中引用) | vars: {nginx_port: 80} |
tasks |
必选!要执行的任务列表(每个任务对应一个 Ansible 模块) | 见下方示例 |
handlers |
处理器(触发式任务,仅被 notify 调用时执行,如重启服务) |
见下方示例 |
roles |
调用预定义的 Role(模块化复用) | roles: [nginx, mysql] |
pre_tasks/post_tasks |
任务执行前 / 后的前置 / 后置任务(如执行前备份配置) | 见进阶示例 |
tags |
标签(指定只执行部分任务,方便调试) | tags: ["deploy", |
-
缩进必须 "层级分明":
- Play 层级(
gather_facts/hosts/tasks):相对于- name: first play1缩进 2 个空格; - Tasks 下的任务名称(
- name:):相对于tasks:缩进 2 个空格(总计 4 个); - 任务的模块(
ping:/command:/service:):相对于- name:缩进 2 个空格(总计 6 个); - 模块的参数(
src:/name:/state:):相对于模块(copy:/service:)缩进 2 个空格(总计 8 个);✅ 核心:子元素必须比父元素多缩进 2 个空格,且全程用空格(禁止 Tab)。
- Play 层级(

示例

按 Ansible 缩进规则(2 个空格递进)拆解,核心层级缩进如下:
| 层级 | 内容示例 | 实际缩进量 | 规范要求 | |
|---|---|---|---|---|
| Play 根层级 | - name: first play1 |
0 空格 | 根层级无缩进 | |
| Play 级参数 | gather_facts: false |
2 空格 | 比根层级 + 2 | |
| Tasks 列表项 | - name: test connection |
4 空格 | 比 tasks:+2 | |
| 模块层级(核心) | ping: / command: |
6 空格 | 比任务项 + 2 | |
| Handlers 列表项 | - name: restart httpd |
4 空格 | 比 handlers:+2 | |
| Handler 模块层级 | service: name=httpd... |
6 空格 | 比 handler 项 + 2 |
验证命令
ansible-playbook test1.yaml --syntax-check

输出
