Ansible教程:Playbook介绍与基本使用 作者:马育民 • 2026-09-26 08:45 • 阅读:10001 # 介绍 Playbook 是 Ansible 的**剧本**,使用 **YAML** 编写,用来定义一组在多台主机上顺序执行的自动化任务,替代 ad-hoc 临时命令,适合复杂部署、配置管理、应用发布。 ### 特点 **幂等性**,多次执行结果一致,只会做必要变更;无客户端,基于SSH;可版本控制(git),可复用。 # 术语关系 - **Playbook**:整个YAML文件,由**一个或多个 Play** 组成 - **Play**:绑定一组主机 + 变量 + 任务集合 - **Task**:单个动作,调用 Ansible **Module(模块)**,从上往下顺序执行 - **Module**:Ansible内置执行单元(yum、copy、service、template等) # YAML语法要点 详见 [链接](https://www.malaoshi.top/show_1EF5qtN5iYYK.html "链接") - **只能空格缩进,禁止Tab** - `---` 文件开头 - `#`注释 - `-`代表列表项 - `{{ var }}` Jinja2变量模板。 # Play 顶层常用参数 ```yaml --- - name: 部署Nginx的play # play名称,可选 hosts: webservers # 必填,目标主机/主机组,来自inventory清单 gather_facts: true # 默认true,执行前收集被控主机系统信息(ansible_facts);关闭提速 false remote_user: root # 远程登录用户 become: true # 开启sudo提权(相当于sudo) become_user: root # 提权到哪个用户 vars: # 本play内变量 nginx_port: 80 vars_files: # 外部变量文件 - vars/nginx.yml handlers: # 触发器,只有被notify触发才执行 tasks: # 任务列表,核心 ``` # Tasks 任务核心语法 每个 task 调用一个模块,推荐写 `name`(日志输出可读性强)。 ```yaml tasks: - name: 安装nginx yum: name: nginx state: present # present安装,absent卸载,latest最新版 ``` ### 常用内置模块 1. `yum` / `apt`:包管理器 2. `copy`:本地文件复制到远端 3. `template`:Jinja2模板渲染后下发(支持变量) 4. `service`:管理系统服务(start/stop/restart/enabled) 5. `file`:创建目录、修改权限、删除文件 6. `debug`:打印调试信息 7. `shell`:执行shell命令(非幂等,慎用) 8. `command`:执行命令,不支持管道、重定向,比shell安全 # 例子:nginx部署(使用centos) 编辑playbook文件,执行下面命令: ``` vim playbook_nginx.yml ``` 内容: ```yaml --- - name: 批量部署Nginx # 剧本名,可略 hosts: all # 目标主机/主机组,来自inventory清单 become: true # 开启sudo提权 tasks: - name: 安装nginx # 任务名 yum: # 使用yum模块,适用于centos系统上执行安装 name: nginx # 安装nginx state: present # 表示安装操作 - name: 启动nginx,并设置开机自启 service: # 调用serivce模块 name: nginx # 设置nginx服务 state: started # 启动服务 enabled: yes # 开机自启 ``` # 例子:nginx部署(使用ubuntu) 编辑playbook文件,执行下面命令: ``` vim playbook_nginx.yml ``` 内容: ```yaml --- - name: 批量部署Nginx # 剧本名,可略 hosts: all # 目标主机/主机组,来自inventory清单 become: true # 开启sudo提权 tasks: - name: 安装nginx # 任务名 apt: # 使用apt模块,适用于ubuntu系统上执行安装 name: nginx # 安装nginx state: present # 表示安装操作 - name: 启动nginx,并设置开机自启 service: # 调用serivce模块 name: nginx # 设置nginx服务 state: started # 启动服务 enabled: yes # 开机自启 ``` # 执行命令 ### 语法检查 检查 playbook 的语法,不会执行操作 ```bash ansible-playbook playbook_nginx.yml --syntax-check -i ansible_client.ini ``` ### 跑测试,模拟执行,不改动真实机器(推荐) ``` ansible-playbook playbook_nginx.yml --check -i ansible_client.ini ``` 或者 ``` ansible-playbook playbook_nginx.yml -C -i ansible_client.ini ``` ### 执行剧本 ``` ansible-playbook playbook_nginx.yml ``` ### 指定主机清单文件 ``` ansible-playbook playbook_nginx.yml -i ansible_client.ini ``` ### 只针对部分主机执行 ``` ansible-playbook playbook_nginx.yml -i ansible_client.ini -l 192.168.1.100 ``` # 返回结果说明 [](https://www.malaoshi.top/upload/0/3/1GW47Q9KYYJq.png) - `ok`:任务已满足状态,无变更 - `changed`:Ansible对主机做了修改 - `failed`:任务执行失败,该主机停止后续任务 - `skipped`:when条件不满足,跳过任务 # 注意 1. 优先使用原生模块,尽量少用`shell/command`,破坏幂等性; 2. YAML缩进严格,空格数量必须对齐,不要Tab; 3. 生产执行前,一定先 `--check` 干跑; 4. 复杂项目拆分为Role,不要写超大单文件playbook; 5. 尽量开启`gather_facts`做系统判断,不需要再关闭提速; 6. 敏感密码不要明文写yaml,使用`ansible-vault`加密文件。 原文出处:/show_1GW47QCIULHx.html