Ansible roles(角色)主要用于层次化,结构化的组织playbook。roles能够自动装载变量文件,普通文件,handler文件,task文件等等文件。
roles有固定的目录结构,总共有8个文件夹,分别是tasks, handlers, library, files, templates, vars, defaults和meta,每个文件夹下面都有一个文件,具体可见下图
注:main.yml文件是我们的playbook文件,文件中include了role1和role2
role目录结构文件用途
下面我们通过一个表格列举出来role目录结构中的文件都用来做什么的
文件 | 用途 |
tasks/main.yml | 用来定义这个role要执行的task(任务)列表 |
handlers/main.yml | 定义一系列handlers,用来任务执行成功之后被通知调用,可用于role内部和外部 |
library/my_module.py | 自定义module,可在当前role使用 |
vars/main.yml | 定义该role的其他变量 |
files/main.yml | 该role部署需要用到的文件 |
templates/main.yml | 该role部署需要用到的template文件 |
meta/main.yml | 该role需要用到的metadata,包括role依赖 |
role使用
我们有3种方式去使用roles,分别是play级别, tasks级别通过include_roles引入,tasks级别通过import_role引入。
play级别
这是最经典的一种引入roles的方式,使用roles选项引入一个或者多个role。通过这种方式引入的roles,会在play中所有其他task之前执行。
具体使用如下
---
- hosts: webservers
roles:
- common
- webservers
在这个playbook中我们定义了一个play webservers,这个play下面引入了2个role,一个是common,一个是webservers。
我们都知道playbook最终是要执行task或者handler,那当我们在task中引入role之后,具体是怎么把task和handler还有需要使用到的变量加入到play中呢?
从上面的流程图我们可以知道,
1.检查roles/x/task/main.yml文件是否存在,如果存在,把该文件下的所有task添加到play中
2.检查roles/x/handlers/main.yml文件是否存在,如果存在,把该文件下所有的handlers添加到play中
3.检查roles/x/vars/main.yml文件是否存在,如果存在,把该文件下的所有变量添加到play中
4.检查roles/x/defaults/main.yml文件是否存在,如果存在,把该文件下的所有变量添加到play中
5.检查roles/x/meta/main.yml文件是否存在,如果存在,把该文件下的所有role依赖添加到play中
6.对于roles/x/{files,templates,tasks}下的所有文件,脚本,模板,或者包含的task都不做添加到play中,直接通过引用访问即可。
task include_role引入
这种是在task级别去引入roles,跟据task所在位置正常执行,也就是说如果引入roles的task之前还有其他task,那就会先执行其他task,然后再执行这个task。具体使用可参考下面这个例子
---
- hosts: webservers
tasks:
- name: Print a message
ansible.builtin.debug:
msg: "this task runs before the example role"
- name: Include the example role
include_role:
name: example
- name: Print a message
ansible.builtin.debug:
msg: "this task runs after the example role"
task include_role引入
这种方式的引入跟第一种play级别引入的行为是一样的。具体使用可参考下面实例
---
- hosts: webservers
tasks:
- name: Print a message
ansible.builtin.debug:
msg: "before we run our role"
- name: Import the example role
import_role:
name: example
- name: Print a message
ansible.builtin.debug:
msg: "after we ran our role"