在本章中,我将为您介绍 Ansible 中的角色(Role)是什么,以及如何在您的 Ansible Playbook 中日常使用它。
Ansible 角色的作用
- 实现代码复用 角色是 Ansible 中实现代码复用的重要机制,类似于传统编程中的函数。通过使用角色,您可以更快速地开发 Playbook,并复用 Ansible 代码。
角色的目录结构
角色通常具有以下目录结构:
user.example/
├── defaults
│ └── main.yml
├── files
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── README.md
├── tasks
│ └── main.yml
├── templates
├── tests
│ ├── inventory
│ └── test.yml
└── vars
└── main.yml
defaults:main.yml文件包含角色变量的默认值,这些值可以在使用角色时被覆盖。这些变量的优先级较低,通常用于在 Play 中被修改和定制。files: 该目录包含角色任务中引用的静态文件。handlers:main.yml文件包含角色的处理器定义。meta:main.yml文件包含角色的相关信息,包括作者、许可证、支持的平台以及可选的角色依赖。tasks:main.yml文件包含角色的任务定义。templates: 该目录包含角色任务中引用的 Jinja2 模板。tests: 该目录可以包含用于测试角色的清单文件和test.ymlPlaybook。vars:main.yml文件定义角色的变量值。这些变量通常用于角色内部,优先级较高,不建议在 Play 中修改。
并非每个角色都会包含所有这些目录。
在 Playbook 中使用 Ansible 角色
示例 1:简单角色使用
文件名:role_simple.yml
---
- name: role example
hosts: all
roles:
- role1
- role2
- 功能:将
role1和role2应用于所有受管主机。
示例 2:带变量的角色使用
文件名:role_vars.yml
---
- name: role example
hosts: all
roles:
- role: role1
- role: role2
var1: value
var2: value
- 功能:将
role1和role2应用于所有受管主机。role2带有两个变量参数。
角色的执行顺序
在 Playbook 中,任务的执行顺序如下:
pre_tasks: 在角色执行之前运行的任务。如果这些任务通知了处理器,则这些处理器任务会在角色或正常任务之前执行。- 角色任务: 角色的任务被添加到任务列表的开头。如果有多个角色,第二个角色的任务列表会添加在第一个角色之后。
- 正常任务: Playbook 中定义的普通任务。
post_tasks: 在 Playbook 的正常任务之后执行的任务。如果这些任务通知了处理器,则这些处理器任务会在角色任务或正常任务之后运行。- 处理器: 在所有任务执行完成后,通知的处理器任务会被执行。
示例文件:role_order.yml
---
- name: order of execution example
hosts: all
pre_tasks:
- debug:
msg: 'pre-task'
notify: my handler
roles:
- role1
tasks:
- debug:
msg: 'first task'
notify: my handler
post_tasks:
- debug:
msg: 'post-task'
notify: my handler
handlers:
- name: my handler
debug:
msg: Running my handler
Ansible Galaxy
Ansible Galaxy 是一个社区驱动的平台,用于共享和下载 Ansible 角色。
手动安装角色
$ ansible-galaxy install geerlingguy.redis -p roles/
使用 requirements.yml 安装角色
文件名:requirements.yml
- src: geerlingguy.redis
version: "1.5.0"
安装命令:
$ ansible-galaxy install -r roles/requirements.yml -p roles
通过 Ansible Galaxy,您可以轻松地安装和管理角色,从而加速开发并复用社区提供的高质量代码。
总结
Ansible 角色是实现代码复用的重要机制,通过合理的目录结构和清晰的执行顺序,您可以更高效地开发 Playbook。Ansible Galaxy 提供了一个丰富的角色库,帮助您快速获取和使用高质量的 Ansible 角色。