ansible Role

ansible role

ansible Role 介绍

ansilbe roles是自1.2版本引入的新特性,用于层次性、结构化地组织playbook。
roles能够根据层次型结构自动装载变量文件、tasks以及handlers等。
要使用roles只需要在playbook中使用include指令即可。简单来讲,
roles就是通过分别将变量、文件、任务、模板及处理器放置于单独的目录中,
并可以便捷地include它们的一种机制。角色一般用于基于主机构建服务的场景中,
但也可以是用于构建守护进程等场景中。

简而言之:

ad-hoc 适用于临时命令的执行。
playbook 适用 中小项目。
而大型项目一定使用 roles。

roles 主要依赖于目录命名和摆放。默认 tasks/main.yml 是所有任务的入口。所以使用roles的过程可以理解为:为目录规范化命名的过程。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$tree
.
├── playbooks.yml <==执行剧本
└── roles <==角色必须与执行剧本在同一级目录中
├── project <==项目名称
│ ├── defaults
│ ├── files
│ ├── handlers
│ ├── meta
│ ├── tasks
│ ├── templates
│ └── vars
└── project1 <==另一个项目


role 目录结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
(ansible) $ tree roles                                  
roles
├── test_role # 这个 test_role 就是我们自定义的 角色名称,也是个目录名称
│   ├── defaults
│   │   └── main.yml
│   ├── files
│   │   ├── a.PPT
│   │   └── b.PPT
│   ├── handlers
│   │   └── main.yml
│   ├── meta
│   │   └── main.yml
│   ├── README.md
│   ├── tasks
│   │   ├── file.yml
│   │   └── main.yml
│   ├── templates
│   ├── tests
│   │   ├── inventory
│   │   └── test.yml
│   └── vars
│   └── main.yml
└── testrole.yml # 和 test_role 角色名称并列的地方我们 放了一个 playbook 文件,这个文件里面会引用到这个角色:` - role: test_role `

tasks目录:角色需要执行的主任务文件放置在此目录中,默认的主任务文件名为main.yml,当调用角色时,默认会执行main.yml文件中的任务,你也可以将其他需要执行的任务文件通过include的方式包含在tasks/main.yml文件中。

handlers目录:当角色需要调用handlers时,默认会在此目录中的main.yml文件中查找对应的handler。

defaults目录:角色会使用到的变量可以写入到此目录中的main.yml文件中,通常,defaults/main.yml文件中的变量都用于设置默认值,以便在你没有设置对应变量值时,变量有默认的值可以使用,定义在defaults/main.yml文件中的变量的优先级是最低的。

vars目录:角色会使用到的变量可以写入到此目录中的main.yml文件中,看到这里你肯定会有疑问,vars/main.yml文件和defaults/main.yml文件的区别在哪里呢?区别就是,defaults/main.yml文件中的变量的优先级是最低的,而vars/main.yml文件中的变量的优先级非常高,如果你只是想提供一个默认的配置,那么你可以把对应的变量定义在defaults/main.yml中,如果你想要确保别人在调用角色时,使用的值就是你指定的值,则可以将变量定义在vars/main.yml中,因为定义在vars/main.yml文件中的变量的优先级非常高,所以其值比较难以覆盖。

meta目录:如果你想要赋予这个角色一些元数据,则可以将元数据写入到meta/main.yml文件中,这些元数据用于描述角色的相关属性,比如 作者信息、角色主要作用等等,你也可以在meta/main.yml文件中定义这个角色依赖于哪些其他角色,或者改变角色的默认调用设定。

templates目录: 角色相关的模板文件可以放置在此目录中,当使用角色相关的模板时,如果没有指定路径,会默认从此目录中查找对应名称的模板文件。

files目录:角色可能会用到的一些其他文件可以放置在此目录中,比如,当你定义nginx角色时,需要配置https,那么相关的证书文件即可放置在此目录中。

怎么执行?,直接执行这个 入口的playbook 文件即可

1
2
3
4
5
6

ansible-playbook ./roles/testrole.yml --list-tasks -vv




默认 ansible 从哪里 找 role 呢?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
By default, Ansible looks for roles in the following locations:  默认会从 下面几个地方查找 role 角色。

- in collections, if you are using them
- in a directory called ``roles/``, relative to the playbook file, 一个叫 roles 的子目录,相对于 playbook 文件的
- in the configured :ref:`roles_path <DEFAULT_ROLES_PATH>`. The default search path is ``~/.ansible/roles:/usr/share/ansible/roles:/etc/ansible/roles``.
- in the directory where the playbook file is located

If you store your roles in a different location, set the :ref:`roles_path <DEFAULT_ROLES_PATH>` configuration option so Ansible can find your roles. Checking shared roles into a single location makes them easier to use in multiple playbooks. See :ref:`intro_configuration` for details about managing settings in ansible.cfg.

Alternatively, you can call a role with a fully qualified path:

.. code-block:: yaml

---
- hosts: webservers
roles:
- role: '/path/to/my/roles/common'

入口的playbook 文件

1
2
3
4
5
- hosts: localhost
roles:
- role: test_role


入口的playbook 文件,可以使用 import_role

1
2
3
4
5
6
7
8
9
10
- name: Config role with import_role
hosts: localhost
gather_facts: yes
become: no

tasks:
- name: Config role with import_role task1
import_role:
name: test_role