5.1 role 和 Ansible Galaxy 的简要介绍
5.1.1 role
role 是高级版本的include语句,include用来分享单个Playbook文件,而role可以分享一个文件夹,文件夹里面包含task、handlers、file、template和variable。
文件夹里面包含了实现一个完整的功能所有文件,例如,安装和配置web服务器Nginx。
5.1.2 Ansible Galaxy
Ansible Galaxy 是Ansible提供的分享role的网站。
5.2 role的放置位置
5.2.1 当前目录的roles文件夹下
无论Ansible对roles path 是如何设置的,放在当前子目录roles文件夹下的role都会被找到。
5.2.2 环境变量 ANSIBLE_ROLES_PATH 定义的文件夹
如果定义了 ANSIBLE_ROLES_PATH ,那么Ansible也会搜索该文件夹下放置的role。
5.2.3 Ansible 配置文件中roles_path定义的文件夹
定义配置变量 roles_path 的格式如下,如果有多个目录,则使用冒号(:)分割。
roles_path = /etc/ansible/roles:/opt/roles
如果定义了环境变量 ANSIBLE_ROLES_PATH ,那么配置文件中定义的roles路径是不会起效的。
5.2.4 默认文件夹 /etc/ansible/roles
这个优先级最低的。
5.3 在Playbook 中如何调用role
5.3.1 调用最简单的role
假设我们当前目录下有roles目录,里面有个叫做 simple 的role,那么在roles的同级目录下。我们可以创建一个playbook文件来调用这个role,假设该文件叫做 site.yml,内容如下
---
- hosts: localhost
roles:
- simple
5.3.2 通过pre_tasks 和 post_tasks 调整role和任务的顺序
如果想让一些任务在role之前和和之后执行,可以通过Ansible 提供了两个关键字 pre_tasks 和 post_tasks 来实现。如下:
- hosts: localhost
pre_tasks:
- name: pre task
debug: msg="hello in pre task"
roles:
- simple
post_tasks:
- name: post task
debug: msg="hello in post task"
5.3.3 调用带有参数的role
调用带有参数的role有两种方法:一是把role写成 JSON Object 的格式,直接传入参数;二是通过vars关键字使用YAML字典格式传入关键字。
---
- hosts: localhost
roles:
- { role: my_role_with_vars, ex_param: "Hello from ex_param for the 1st time" }
- role: my_role_with_vars
vars:
ex_param: "Hello from ex_param for the 2nd time"
5.3.4 与when一起使用role
role当然也可以和when一起使用,即当满足一定条件时再执行role。与role的传参语法类似,调用方式有两种。
---
- hosts: localhost
roles:
- { role: simple, when: "ansible_os_family == 'Dibian'" }
- role: simple
when: "ansible_os_family == 'Dibian'"
5.4 如何写role
5.4.1 role 的完整定义
在 "3.3.6 重用 Playbook" 章节上已经有详细的介绍了,主要是一个role都包含了什么子目录。
5.4.2 默认变量和普通变量的区别
defalults/main.yml 中的变量时默认变量,优先级是变量中最低的,用于放置一些需要被覆盖的变量。
vars/main.yml 中的变量是role变量,优先级比较高,放置一些不想被覆盖的变量。所以变量在命名的时候一般都加入role的名字用作前缀,放置不小心被Playbook中定义的变量覆盖。
5.4.3 tasks/main.yml 如何使用变量、静态文件和模版
任务是Playbook及role的核心逻辑。所以,要想知道role 做了什么,首先要看role的任务文件 tasks/main.yml,该文件也可以看作一个role的入口文件。学会如何在该文件中使用变量、静态文件和模版等资源是需要写role的关键。
role中的资源可以分为两类:一类是放在 x/*/main.yml 中会自动被加载的资料;还有一类是放在文件 x/*/other_but_main.yml 中,需要显式调用的资源。
- 使用 x/*/main.yml 中的变量和handler
- 变量和handler: 就像使用同一个Playbook中的资源一样
- x/{files,templates}/下的文件: 就像在同一目录下一样。
- 使用 x/*/other_but_main.yml 中的资源
如果 role x 下面的内容比较复杂,需要对任务或者vars进一步分类,可以使用除main.yml 以外的文件。Ansible 提供了两个关键字:include 和 include_vars,来分别引入role中非main.yml 其他文件包含的任务和变量。
示例如下,有个对服务器进行初始化的role的目录结构如下:
.
|-- tasks
| |-- configure.yml
| |-- install.yml
| `-- main.yml
|-- templates
| `-- ntp.conf.j2
`-- vars
|-- Debian.yml
|-- main.yml
`-- RedHat.yml
那么在 x/*/main.yml 中,怎么来加载这些任务或者变量呢?
---
- name: 加载变量文件
include_vars: RedHat.yml
# 加载运行其他的任务
- include: install.yml
- include: configure.yml
5.5 role 的依赖
安装一个Nginx需要配置yum/apt仓库,如果不想再配置Nginx的Playbook重新实现该功能,那么可以通过 role 的依赖来解决。 role 依赖关系的定义文件是 x/meta/main.yml。如果在 role x 定义依赖 role y,那么在Playbook中调用 role x 之前会先调用 role y。当多个role依赖同一个role时,Ansible会自动进行过滤,避免重复调用相同参数的role。
下面的示例中,role db 和 Web 都依赖 role common。如果在Playbook中调用 db和Web,那么Ansible会保证在运行 role db 和Web前,先运行 role common,并且只运行一次。
文件目录如下:
`-- roles
|-- common
| `-- tasks
| `-- main.yml
|-- db
| |-- meta
| | `-- main.yml
| `-- tasks
| `-- main.yml
`-- Web
|-- meta
| `-- main.yml
`-- tasks
`-- main.yml
那么在 {db,Web}/meta/main.yml 中的内容应该是:
---
dependencies:
- { role: common }
最后在调用的Playbook中,我们不需要调用的 common role。
---
roles:
- db
- web
5.6 Ansible Galaxy 网站介绍
地址为: https://galaxy.ansible.com ,具体的介绍略过。
网友评论