ansible的role扩展(六)
role是将playbook分割为多个文件的主要机制。它大大简化了复杂playbook的编写,同时还使得他们非常易于复用。roles就是将一个大的playbook拆开放到不同的目录中,可以方便调用。
一、role介绍
1.1 roles结构
每个ansible的role都会有一个名字,比如“webservers”,与webservers role相关的文件都存放在roles/webservers目录中。
这个目录中包含以下文件及目录:
# tree -L 1 /etc/ansible/playbooks/roles/webservers/
|-- defaults #可以被覆盖的默认变量 |-- files #保存着需要上传到主机的文件 |-- handler |-- meta #role的依赖信息 |-- tasks #task |-- templates #保存Jinja2模板文件 `-- vars #不应该被覆盖的变量
#上面显示的都是目录。上面每个单独的文件都是可选的,如果你想用哪个就在哪个目录下面创建main.yaml,如果不包含,目录里面可以是空的。
1.2 例子解释
我们还是以一个TLS的nginx的创建过程为例
先查看下nginx的目录结构:
# tree -L 2 /etc/ansible/playbooks/roles/nginx/
|-- default |-- files #keys认证的目录和nginx源码安装包都在files目录下面 | |-- keys | `-- nginx-1.10.3.tar.gz |-- handlers | `-- main.yaml |-- meta |-- tasks | |-- main.yaml | `-- ssl.yaml |-- templates #模板文件在这里面 | |-- nginx.conf.j2 | `-- nginx_index.html.j2 `-- vars `-- main.yaml
查看入口playbook文件:
# cat /etc/ansible/playbooks/nginx.yaml
--- - hosts: 7servers roles: - {role: nginx, username: www ,when: "ansible_distribution_major_version =='7' and ansible_distribution == 'CentOS'"}
注:
这里最简单的写法就是:
roles:
- role: nginx #这就是引用roles目录下的nginx目录,然后一执行ansible-playbook nginx.yaml就会去/etc/ansible/playbooks/roles/nginx目录下找相关的yaml内容了。当然引用多个roles文件的话,就照着这个格式写多行就可以了。
下面就是我们上面的那种写法也是常用的:
role: nginx #就是引用roles目录下的nginx目录下的相关yaml。
username: www #就是给username变量赋值www。当然也可以这这个单拿出来,写到role:nginx的下面,以 username: www的形式。
when: "ansible_distribution_major_version =='7' and ansible_distribution == 'CentOS'" #这就是判断,当两个条件都为真的时候才会执行前面的role: nginx。当然也可以定义一个条件。当然有很多种比较方式:http://www.jianshu.com/p/04516cbba336都有举例。这里我们知道这个when,根据不同的条件执行的不同的playbook,如不同的操作系统,不同的系统版本,不同的主机环境等等,来执行不同的