一、介绍
role 角色就是把一个 playbook 中的代码按照一定的规则分解开。
模块化编程的思想组织 playbook 的代码。
二、role 的规则
先看一个示例:
webservers/
├── defaults
│ └── main.yml
├── files
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── tasks
│ └── main.yml
├── templates
└── vars
└── main.yml
上面示例中 webservers 就成为一个 role, 这个 role 的主要功能是部署并配置 nginx。
从表面上看,它就是一个目录。目录的名字也就是role的名字,示例中,role 的名字叫做 webservers
。
进到这个role名字的目录里,会发现好多子目录。
使用时,每个目录必须包含一个main.yml文件,这个文件应该包含如下目录名称对应的内容:
tasks
-包含角色要执行的任务的主要列表。handlers
-包含处理程序,此角色甚至该角色之外的任何地方都可以使用这些处理程序。defaults
-角色的默认变量。vars
-角色的其他变量。files
-包含可以通过此角色部署的文件。templates
-包含可以通过此角色部署的模板。meta
-为此角色定义一些元数据。
角色必须至少包含这些目录中的其中之一,但是最好删除掉任何未使用的目录。
三、role 的制作过程
分解这个PlayBook,命名role 的名字为 webservers
webservers/
│
├── files
├── handlers
│ └── main.yml
├── tasks
│ └── main.yml
├── templates
└── vars
└── main.yml
files 文件夹存放文件
存放 default.conf 配置文件
handlers 文件夹中的main.yml 文件
- name: reload nginx server
service: name=nginx state=reloaded
when: nginxsyntax.rc == 0
tasks 文件夹中的 main.yml 文件
- name: 传输仓库文件
copy:
src: nginx.repo
dest: /etc/yum.repos.d/nginx.repo
- name: 安装 nginx
yum: name=nginx state=present
- name: 利用模板文件,设置主配置文件
template:
src: "{{ main_conf }}"
dest: /etc/nginx/nginx.conf
tags: update
# 触发任务
notify: reload nginx server
- name: 子配置文件
copy:
src: "{{ sub_conf }}"
dest: /etc/nginx/conf.d/
tags: update
notify: reload nginx server
- name: check nginx syntax
shell: /usr/sbin/nginx -t
register: nginxsyntax
tags: update
- name: 启动 nginx 服务
when: nginxsyntax.rc == 0
systemd: name=nginx state=started
templates 文件夹存放模板
存放 nginx.conf.j2 模板
vars 文件夹中的 main.yml 文件
main_conf: nginx.conf.j2
sub_conf: default.conf
四、如何在PlayBook中使用 Role
1. 经典(原始)方式
编译一个 playbool,内容如下:
在 playbook 中给定
roes:
属性
文件:deploy-nginx.yml
- name: use role
hosts: webservers
roles:
- webservers
保证 deploy-nginx.yml 文件的当前目录下有 webservers 角色
执行:
ansible-playbook deploy-nginx.yml
2. 新方式
在 playbook 中给定 import_role
属性
这种方式适用于 Ansible 2.4及以上
- name: use rose
hosts: webservers
tasks:
- debug:
msg: "before we run our role"
- import_role:
name: webservers
- debug:
msg: "after we ran our role"
执行方式同第一种