[TOC]
## Roles 介绍
`roles`是一个比较重要的概念,可以通过`Roles`来管理不同的任务,对任务按照角色的方式来进行分组,比如可以分为`db-server`和`web-server`,分别对两个组进行管理,去自动的加载某些 `vars_files`,`task`s 以及 `handlers`。
## 定义Roles
### 手动定义
`Roles`通过目录结构进行管理,目录定义结构如下:
```
ansible/
--- main.yml
--- test.yml
roles/
db-server/ #Roles的名字
files/ #copy等模块会自动来这里找文件,从而我们不必写绝对路径,只需写文件名
templates/ #存放模板文件
tasks/ #存放playbook的目录,其中main.yml是主入口文件,
#在main.yml中导入其他yml文件,要采用import_tasks关键字,include要弃用了
--- main.yml
# # 某些Roles下的二级目录中,必须包含一个main.yml文件,以便ansible可以调用
handlers/ # 存放tasks中的notify指定的内容
--- main.yml
vars/
--- main.yml
defaults/ #必须存在的目录,存放默认的变量,模板文件中的变量就是引用自这里
# defaults中的变量优先级最低,通常我们可以临时指定变量来进行覆盖
--- main.yml
meta/ #角色依赖,会被首先运行
--- main.yml
```
* 如果 roles/x/tasks/main.yml 存在, 其中列出的 tasks 将被添加到 play 中
* 如果roles/x/handlers/main.yml 存在, 其中列出的 handlers 将被添加到 play 中
* 如果roles/x/vars/main.yml 存在, 其中列出的 variables 将被添加到 play 中
* 如果roles/x/meta/main.yml 存在, 其中列出的 “角色依赖” 将被添加到 roles 列表中 (1.3 andlater)
* 所有 copy tasks 可以引用 roles/x/files/ 中的文件,不需要指明文件的路径。
* 所有 scripttasks 可以引用 roles/x/files/ 中的脚本,不需要指明文件的路径。
* 所有 template tasks 可以引用roles/x/templates/ 中的文件,不需要指明文件的路径。
* 所有 include tasks 可以引用roles/x/tasks/ 中的文件,不需要指明文件的路径。
### 命令行自动创建
也可以通过命令行创建,但是创建的是所有目录,平时使用中,并不会用到所有目录,所以一般手动创建
```
ansible-galaxy init web roles
```

### 自定义Roles寻找路径
ansible 寻找的默认Roles目录路径是`./roles:/usr/share/ansible/roles:/etc/ansible/roles`
可以通过修改`ansible.cfg`来自定义配置
[官方手册](http://www.ansible.com.cn/docs/intro_configuration.html#roles-path)
### 设置 Roles 触发条件
```
---
- hosts: webservers
roles:
- { role: some_role, when: "ansible_os_family == 'RedHat'" }
```
>还有其他的 ”条件子句”可以设置。
### Roles 角色依赖
如果一个角色依赖于第二个角色,而第二个角色依赖于第三个角色,则Ansible将执行第三个角色,然后执行第二个角色,然后执行第一个角色
```
---
dependencies:
- role: common
vars:
some_parameter: 3
- role: apache
vars:
apache_port: 80
- role: postgres
vars:
dbname: blarg
other_parameter: 12
```
