使用 Role 组织自动化内容

AnsibleBeginner
立即练习

简介

刚开始使用 Ansible 时,把所有内容放在一个大型的 playbook.yml 文件中没有问题。但随着自动化内容增长到数百行,这个文件就会变得难以维护。

解决方案是 Ansible Role。

Role 就像文件柜中的文件夹。你不再把所有内容放在一个巨大的文档中,而是按逻辑拆分到不同文件夹中:一个文件夹存放「Web 服务器」任务,另一个文件夹存放「数据库」任务,等等。

Role 很重要,因为自动化最终会逐渐接近软件工程。当 Playbook 超过几个任务后,结构、命名和复用能力与首次成功运行同样重要。

在本实验中,你将:

  1. 使用 ansible-galaxy 创建标准的 Role 结构。
  2. 将任务移动到该 Role 中。
  3. 从一个简单的「主 Playbook」中运行该 Role。

Role 很重要,因为可扩展的自动化需要良好的结构。随着代码库不断增长,组织方式与首次成功运行同样重要。

初始化 Role

首先创建目录结构。你可以手动创建所有目录,但 Ansible 提供了一个名为 ansible-galaxy 的工具,可以自动完成这项工作。

这个标准布局很有价值,因为每个 Role 都会为任务、变量、文件、模板和处理程序提供固定且可预测的位置。当结构保持一致时,团队成员可以更轻松地阅读彼此的自动化代码。

进入项目目录:

cd ~/project

创建一个用于存放 Role 的目录:

mkdir roles

现在创建一个名为 myrole 的新 Role。可以把这看作是为自动化内容创建一个「包」或「模块」。

ansible-galaxy init roles/myrole

查看它创建的内容:

ls -R roles/myrole

你将看到许多目录(tasks、handlers、vars 等)。

  • tasks:存放实际步骤,例如安装、启动和复制。
  • vars:存放变量。
  • files:存放静态文件,例如图像。

本实验将重点介绍 tasks 目录。

定义 Role 任务

现在需要为 Role 添加一些工作。Role 的主要任务列表位于 tasks/main.yml 中。

我们将创建一个简单任务,用于安装 tree 命令。这个工具可用于查看目录结构。

打开 Role 的任务文件:

nano roles/myrole/tasks/main.yml

添加以下内容。注意,这里不要以 tasks: 开头,因为你已经在任务文件中!

---
## tasks file for roles/myrole
- name: Ensure tree is installed
  apt:
    name: tree
    state: present
  become: yes

关键区别:在普通 Playbook 中,你需要使用 tasks: 部分。在 Role 中,该文件本身就是任务列表,因此只需直接列出任务。

这种分离是 Role 能提高复用性的原因之一。Role 负责一部分专注的自动化逻辑,而 Playbook 决定何时以及在哪些位置包含它。

保存并退出。

创建主 Playbook

现在你已经有了一个 Role,但 Role 不会自行运行。你需要一个「主 Playbook」来调用它。

在主项目目录中创建名为 site.yml 的文件:

nano ~/project/site.yml

这个 Playbook 会非常简短。它只需要说明:「在这些主机上运行这个 Role。」

此时,Playbook 的作用更多是进行编排,而不是容纳所有详细内容。这正是 Role 旨在带来的架构变化。

---
- hosts: localhost
  connection: local
  roles:
    - myrole

代码说明:

  • roles::不再提供 tasks: 列表,而是提供 Role 列表。
  • - myrole:Ansible 会在 roles/ 目录中查找名为 myrole 的文件夹,并执行其中 tasks/main.yml 的内容。

保存并退出。

验证并运行

运行之前,先确认没有输入错误。Ansible 内置了语法检查器。

运行以下命令:

ansible-playbook -i inventory --syntax-check site.yml

如果一切正常,命令只会输出 playbook: site.yml。

如果出现错误,请仔细阅读错误信息——它通常会指出缩进错误所在的具体行号。

现在正式运行 Playbook:

ansible-playbook -i inventory site.yml

你应该会看到 Role 中的任务被执行,输出类似于:TASK [myrole : Ensure tree is installed] ... changed

总结

在本实验中,你学习了组织 Ansible 结构的「专业」方式。

  1. 初始化 Role:使用 ansible-galaxy 创建标准目录结构。
  2. 定义任务:将自动化逻辑放入 tasks/main.yml。
  3. 使用 Role:从简洁的主 Playbook site.yml 中调用该 Role。

随着自动化内容不断增加,你可以为各种功能创建 Role,例如 apache、mysql 和 common,从而让代码易于复用和阅读。