目录
[一、什么是 Ansible Playbook?](#一、什么是 Ansible Playbook?)
[二、Playbook 的基本结构](#二、Playbook 的基本结构)
[一个最简单的 Playbook 例子](#一个最简单的 Playbook 例子)
[三、YAML 格式的注意事项](#三、YAML 格式的注意事项)
[正确 vs 错误的缩进:](#正确 vs 错误的缩进:)
[编辑器小技巧(如果你用 Vim)](#编辑器小技巧(如果你用 Vim))
[四、Playbook 的组成部分详解](#四、Playbook 的组成部分详解)
[1. Play(一场"戏")](#1. Play(一场"戏"))
[2. Task(具体"动作")](#2. Task(具体"动作"))
[五、模块:Ansible 的"工具箱"](#五、模块:Ansible 的"工具箱")
[六、运行 Playbook](#六、运行 Playbook)
[1. 语法检查(避免低级错误)](#1. 语法检查(避免低级错误))
[2. 空运行(看会做什么,但不真做)](#2. 空运行(看会做什么,但不真做))
[3. 详细模式(看更多信息)](#3. 详细模式(看更多信息))
[十一、总结:Playbook 的核心价值](#十一、总结:Playbook 的核心价值)
[为什么用 Playbook?](#为什么用 Playbook?)
一、什么是 Ansible Playbook?
想象一下,你要给家里的智能设备写一个"操作说明书",告诉它们:
-
早上7点:打开窗帘、煮咖啡
-
晚上10点:关灯、锁门、调整空调温度
Ansible Playbook 就是这样的"操作说明书",只不过它是给服务器用的。它是一个文本文件,里面写着:
-
要对哪些服务器操作
-
要按什么顺序执行什么任务
-
每个任务要达到什么效果
简单说:Playbook = 剧本,告诉 Ansible 这台"导演"如何指挥服务器"演员"们表演。
二、Playbook 的基本结构
一个最简单的 Playbook 例子
bash
---
# 这是一个完整的 Playbook
- name: 配置Web服务器 # 这场"戏"叫什么名字
hosts: webservers # 哪些"演员"上场(服务器列表)
tasks: # 要执行的动作列表
- name: 安装Apache # 第一个动作:安装Web服务器
ansible.builtin.dnf:
name: httpd # 要安装的软件包名
state: present # 确保已安装
结构拆解:
-
---:YAML 文件开头标记(就像文章的标题) -
name:给这个 Play 起个名字(方便识别) -
hosts:指定在哪些服务器上执行 -
tasks:具体要做什么(可以多个任务)
三、YAML 格式的注意事项
关键规则:
-
只使用空格缩进(绝对不要用 Tab 键)
-
相同层级的要对齐(像写代码一样)
-
列表项用
-开头(前面要有空格)
正确 vs 错误的缩进:
✅ 正确的:
bash
tasks:
- name: 安装软件
ansible.builtin.dnf:
name: nginx
state: present
❌ 错误的:
bash
tasks:
- name: 安装软件
ansible.builtin.dnf: # 这里缩进错了!
name: nginx
state: present
编辑器小技巧(如果你用 Vim)
在 ~/.vimrc 文件中添加这行,编辑 YAML 文件时会自动帮忙:
bash
autocmd FileType yaml setlocal ai ts=2 sw=2 et
意思是:遇到 YAML 文件时,自动缩进,Tab 显示为2个空格。
四、Playbook 的组成部分详解
1. Play(一场"戏")
一个 Playbook 就好像剧本可以包含多场"戏",按顺序执行:
bash
---
# 第一场戏:配置数据库
- name: 配置MySQL服务器
hosts: db_servers
tasks:
- name: 安装MySQL
ansible.builtin.dnf:
name: mysql-server
state: latest
bash
# 第二场戏:配置Web服务器
- name: 配置Web应用
hosts: web_servers
tasks:
- name: 安装Node.js
ansible.builtin.dnf:
name: nodejs
state: present
2. Task(具体"动作")
每个 Task 使用一个模块来完成具体工作:
bash
tasks:
# 任务1:创建用户
- name: 创建应用用户
ansible.builtin.user:
name: appuser
uid: 1001
state: present
# 任务2:创建目录
- name: 创建应用目录
ansible.builtin.file:
path: /opt/myapp
state: directory
owner: appuser
mode: '0755'
# 任务3:启动服务
- name: 启动应用服务
ansible.builtin.service:
name: myapp
state: started
enabled: yes
五、模块:Ansible 的"工具箱"
什么是模块?
模块是 Ansible 完成具体工作的工具。就像:
-
螺丝刀:拧螺丝(模块:安装软件)
-
锤子:钉钉子(模块:创建文件)
-
尺子:量尺寸(模块:检查状态)
模块命名规则
现在推荐使用全限定名称(FQCN):
bash
# ✅ 推荐:使用完整名称
ansible.builtin.copy
# ⚠️ 可以用但不推荐:只用短名称
copy
哪里找模块?
-
内置模块 :
ansible.builtin集合(自带) -
红帽认证模块:自动化中心(企业级,有支持)
-
社区模块:Ansible Galaxy(开源社区贡献)
查看可用模块:
bash
# 查看所有集合和模块
ansible-navigator collections
六、运行 Playbook
基本运行命令
bash
# 最简单的运行方式
ansible-navigator run playbook.yml
# 输出到屏幕(不进入交互模式)
ansible-navigator run -m stdout playbook.yml
运行效果示例
假设有一个安装 Nginx 的 Playbook:
bash
---
- name: 安装和启动Nginx
hosts: web01.example.com
tasks:
- name: 安装Nginx
ansible.builtin.dnf:
name: nginx
state: latest
运行后你会看到:
bash
PLAY [安装和启动Nginx] ******************************
TASK [Gathering Facts] ****************************
ok: [web01.example.com]
TASK [安装Nginx] *********************************
changed: [web01.example.com] # changed表示有更改
PLAY RECAP ****************************************
web01.example.com: ok=2 changed=1 failed=0
说明:
-
ok:已经符合要求,没做修改 -
changed:进行了修改 -
failed:执行失败
七、运行前的检查
1. 语法检查(避免低级错误)
bash
# 检查YAML语法是否正确
ansible-navigator run -m stdout playbook.yml --syntax-check
# 输出示例(成功):
playbook: /home/user/playbook.yml
# 输出示例(失败):
ERROR! Syntax Error while loading YAML...
2. 空运行(看会做什么,但不真做)
bash
# 模拟运行,看会有什么变化
ansible-navigator run -m stdout playbook.yml --check
就像"演习",告诉你会做什么,但不会真的修改服务器。
3. 详细模式(看更多信息)
bash
# 不同详细程度
ansible-navigator run -m stdout playbook.yml -v # 基础详情
ansible-navigator run -m stdout playbook.yml -vv # 更多详情
ansible-navigator run -m stdout playbook.yml -vvv # 连接详情
ansible-navigator run -m stdout playbook.yml -vvvv # 完整详情
八、重要特性:幂等性
什么是幂等性?
幂等性 = 无论执行多少次,结果都一样
举例说明:
-
✅ 幂等的:"确保用户tom存在"(存在就不创建)
-
❌ 不幂等的:"创建用户tom"(每次都创建,第二次会失败)
Ansible 模块大多是幂等的,这意味着:
-
安全:可以放心多次运行
-
可靠:不会因为重复执行而出错
-
高效:只有需要时才执行操作
幂等性示例
bash
- name: 确保文件存在
ansible.builtin.file:
path: /tmp/test.txt
state: touch # 幂等:文件存在就不动
- name: 确保服务运行
ansible.builtin.service:
name: nginx
state: started # 幂等:已经在运行就不动
九、实际编写技巧
技巧1:任务命名要有意义
bash
# ✅ 好的命名
- name: 安装并配置MySQL服务器
# ❌ 不好的命名
- name: 执行dnf安装
技巧2:按逻辑顺序排列任务
bash
tasks:
# 1. 先准备环境
- name: 安装必要软件
...
# 2. 再配置服务
- name: 配置应用
...
# 3. 最后启动服务
- name: 启动并启用服务
...
技巧3:适当添加注释
bash
# 这个Playbook用于部署WordPress博客
---
# 第一部分:准备数据库
- name: 配置MySQL
hosts: db_servers
tasks:
# 安装数据库软件
- name: 安装MySQL服务器
ansible.builtin.dnf:
name: mysql-server
state: latest
十、完整的实战示例
部署一个简单的Web应用
bash
---
# 部署博客系统
- name: 准备服务器环境
hosts: blog_servers
tasks:
- name: 更新系统软件包
ansible.builtin.dnf:
name: "*"
state: latest
- name: 安装Web服务器
ansible.builtin.dnf:
name: nginx
state: present
- name: 创建网站目录
ansible.builtin.file:
path: /var/www/blog
state: directory
- name: 部署网站文件
ansible.builtin.copy:
src: files/index.html
dest: /var/www/blog/
- name: 启动Nginx服务
ansible.builtin.service:
name: nginx
state: started
enabled: yes
- name: 开放防火墙端口
ansible.posix.firewalld:
service: http
permanent: yes
state: enabled
十一、总结:Playbook 的核心价值
为什么用 Playbook?
-
可重复:一次编写,多次运行
-
可读性:像读说明书一样清晰
-
可版本控制:用 Git 管理,知道谁改了啥
-
可共享:团队共享,新人快速上手
-
可自动化:配合 CI/CD,完全自动