Ansible roles(角色)主要用于层次化,结构化的组织playbook。roles能够自动装载变量文件,普通文件,handler文件,task文件等等文件。

roles有固定的目录结构,总共有8个文件夹,分别是tasks, handlers, library, files, templates, vars, defaults和meta,每个文件夹下面都有一个文件,具体可见下图

ansible定义全面的roles目录层级 ansible roles结构_devops


注: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中呢?

ansible定义全面的roles目录层级 ansible roles结构_Ansible_02


从上面的流程图我们可以知道,

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"