柴少鹏的官方网站 技术在分享中进步,水平在学习中升华

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,如不同的操作系统,不同的系统版本,不同的主机环境等等,来执行不同的