NIUCLOUD是一款SaaS管理后台框架多应用插件+云编译。上千名开发者、服务商正在积极拥抱开发者生态。欢迎开发者们免费入驻。一起助力发展! 广告
[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 ``` ![](https://img.kancloud.cn/38/75/38756ae04bb30749a45e03d67c5200a7_461x421.png) ### 自定义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 ```