编写你的第一个 Playbook

AnsibleBeginner
立即练习

简介

在上一个实验中,你运行了单个命令(ansible ... -m ping)。这个命令适合快速检查,但 Ansible 真正强大的地方在于 Playbook。

Playbook 是一个包含自动化指令的文本文件。与普通 Shell 脚本不同,Playbook 通常关注期望达到的最终状态,而不是每个底层命令的执行步骤。

这种期望状态模型是 Ansible 最重要的理念之一。你通常不会要求「严格运行这些命令」,而是描述自动化完成后应该满足的条件。

Playbook 使用 YAML 编写。YAML 是一种易于人类阅读的数据格式,有助于审查、共享和维护自动化内容。

在本实验中,你将编写一个 Playbook,把服务器配置为 Web 服务器,具体包括:

  1. 安装 Nginx(一种常用的 Web 服务器)。
  2. 确保 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::调用 apt module。
  • 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

查看命令输出。你会看到:

  1. Gathering Facts:Ansible 首先检查系统详细信息。
  2. Install nginx:如果 Ansible 需要安装软件包,该任务会显示 changed(黄色)。
  3. Start nginx:如果 Ansible 需要启动服务,该任务会显示 changed(黄色)。

如果第二次运行完全相同的命令,输出会显示为绿色,并显示 ok。这表示「所有内容已经处于期望状态,因此没有进行任何更改」。

最后,手动确认 Nginx 正在运行:

systemctl status nginx

你应该会看到「Active: active (running)」。

总结

在本实验中,你编写了第一个 Ansible Playbook。你学习了:

  1. YAML 语法:如何使用正确的缩进组织 Playbook。
  2. Play:定义 hosts(运行位置)和 become(使用 sudo)。
  3. 任务:使用 apt(用于安装)和 service(用于启动)等 module。
  4. 幂等性:多次运行 Playbook 是安全且稳定的。

你已经从手动运行命令,转向定义「基础设施即代码」。