简介
刚开始使用 Ansible 时,把所有内容放在一个大型的 playbook.yml 文件中没有问题。但随着自动化内容增长到数百行,这个文件就会变得难以维护。
解决方案是 Ansible Role。
Role 就像文件柜中的文件夹。你不再把所有内容放在一个巨大的文档中,而是按逻辑拆分到不同文件夹中:一个文件夹存放「Web 服务器」任务,另一个文件夹存放「数据库」任务,等等。
Role 很重要,因为自动化最终会逐渐接近软件工程。当 Playbook 超过几个任务后,结构、命名和复用能力与首次成功运行同样重要。
在本实验中,你将:
- 使用
ansible-galaxy创建标准的 Role 结构。 - 将任务移动到该 Role 中。
- 从一个简单的「主 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 结构的「专业」方式。
- 初始化 Role:使用
ansible-galaxy创建标准目录结构。 - 定义任务:将自动化逻辑放入
tasks/main.yml。 - 使用 Role:从简洁的主 Playbook
site.yml中调用该 Role。
随着自动化内容不断增加,你可以为各种功能创建 Role,例如 apache、mysql 和 common,从而让代码易于复用和阅读。


