简介
在上一个实验中,你运行了单个命令(ansible ... -m ping)。这个命令适合快速检查,但 Ansible 真正强大的地方在于 Playbook。
Playbook 是一个包含自动化指令的文本文件。与普通 Shell 脚本不同,Playbook 通常关注期望达到的最终状态,而不是每个底层命令的执行步骤。
这种期望状态模型是 Ansible 最重要的理念之一。你通常不会要求「严格运行这些命令」,而是描述自动化完成后应该满足的条件。
Playbook 使用 YAML 编写。YAML 是一种易于人类阅读的数据格式,有助于审查、共享和维护自动化内容。
在本实验中,你将编写一个 Playbook,把服务器配置为 Web 服务器,具体包括:
- 安装 Nginx(一种常用的 Web 服务器)。
- 确保 Nginx 服务处于运行中状态。
然后,你将运行这个 Playbook 来配置本地计算机。
创建 Playbook 文件
先创建 Playbook 文件。按照惯例,主 Playbook 通常命名为 site.yml。
首先,确认你位于项目目录中:
cd ~/project
现在,使用 nano 文本编辑器创建并打开名为 site.yml 的新文件:
nano site.yml
在文件最顶部输入三个短横线。这表示 YAML 文档的开始。
---
需要记住的 YAML 规则:
- 缩进非常重要! 必须使用空格(通常是 2 个),不能使用制表符。如果缩进错误,Ansible 会报错。
- 经常保存文件。在
nano中,按Ctrl+O,然后按Enter保存,但先不要关闭文件,后续步骤还要继续编辑。
定义 Play
一个 Playbook 由一个或多个「play」组成。play 将一组主机映射到要在这些主机上运行的任务。
这种从主机组到任务的映射,使同一个 Playbook 可以从一台计算机扩展到多台计算机。逻辑集中在一个地方,而 inventory 决定它应用于哪些主机。
在 site.yml 文件中,将下面的内容添加到 --- 下方:
---
- hosts: webservers
become: yes
理解代码:
- hosts: webservers:告诉 Ansible:「在 inventory 中[webservers]组列出的每台服务器上运行这些指令。」become: yes:作用类似于在命令前输入sudo。它为 Ansible 提供 root 权限,这是安装软件所必需的。
确保 - hosts 位于行首,短横线前不能有空格。
保存文件(Ctrl+O,然后按 Enter)。
添加安装任务
现在需要告诉 Ansible 要做什么。为此,需要添加一个 tasks 列表。每个任务都会使用一个 module。
由于当前使用的是 Ubuntu,我们将使用 apt module 安装 Nginx。
将 site.yml 更新为下面的内容:
---
- hosts: webservers
become: yes
tasks:
- name: Install nginx
apt:
name: nginx
state: present
理解代码:
tasks::开始任务列表。- name: ...:供人阅读的任务描述。运行 Playbook 时,这段描述会显示在屏幕上。apt::调用aptmodule。name: nginx:指定要安装的软件包。state: present:这是声明式配置的关键部分。我们不是说「现在安装它」,而是说「确保它存在」。- 如果软件包不存在,Ansible 会安装它。
- 如果软件包已经存在,Ansible 不执行任何操作。这种特性称为 幂等性(Idempotency)。
幂等性是配置管理的核心概念。它表示你可以安全地重复运行同一自动化任务,并获得一致的结果,而不会重复产生副作用。
检查缩进:
tasks应与become对齐。- name应缩进 2 个空格。apt应与name对齐。name和state应在apt下方进一步缩进。
保存文件。
添加服务任务
仅安装软件还不够;还需要确保程序正在运行。为此使用 service module。
这也展示了 Playbook 如何分层表达系统状态。一个任务确保软件包存在,另一个任务确保服务处于活动状态。两者共同描述了主机最终应达到的状态。
在 site.yml 的任务列表中添加第二个任务。
---
- hosts: webservers
become: yes
tasks:
- name: Install nginx
apt:
name: nginx
state: present
- name: Start nginx
service:
name: nginx
state: started
理解代码:
service::用于管理系统服务的 module(类似于systemctl)。state: started:确保服务正在运行。如果服务已停止,Ansible 会启动它。
重要: 第二个任务的 - 必须与第一个任务的 - 完全对齐。
保存文件并退出 nano(按 Ctrl+X,然后按 Y,最后按 Enter)。
运行 Playbook
现在开始运行自动化任务!
使用 ansible-playbook 命令。需要告诉它要运行哪个 Playbook(site.yml),以及使用哪个 inventory(hosts.ini)。
运行以下命令:
ansible-playbook site.yml -i hosts.ini
查看命令输出。你会看到:
- Gathering Facts:Ansible 首先检查系统详细信息。
- Install nginx:如果 Ansible 需要安装软件包,该任务会显示
changed(黄色)。 - Start nginx:如果 Ansible 需要启动服务,该任务会显示
changed(黄色)。
如果第二次运行完全相同的命令,输出会显示为绿色,并显示 ok。这表示「所有内容已经处于期望状态,因此没有进行任何更改」。
最后,手动确认 Nginx 正在运行:
systemctl status nginx
你应该会看到「Active: active (running)」。
总结
在本实验中,你编写了第一个 Ansible Playbook。你学习了:
- YAML 语法:如何使用正确的缩进组织 Playbook。
- Play:定义
hosts(运行位置)和become(使用 sudo)。 - 任务:使用
apt(用于安装)和service(用于启动)等 module。 - 幂等性:多次运行 Playbook 是安全且稳定的。
你已经从手动运行命令,转向定义「基础设施即代码」。


