一、介绍
- 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。
使用时,每个目录必须包含一个main.yml文件,这个文件应该包含如下目录名称对应的内容:
- `tasks` -包含角色要执行的任务的主要列表。
- `handlers` -包含处理程序,此角色甚至该角色之外的任何地方都可以使用这些处理程序。
- `defaults`-角色的默认变量。
- `vars`-角色的其他变量。
- `files` -包含可以通过此角色部署的文件。
- `templates` -包含可以通过此角色部署的模板。
- `meta`-为此角色定义一些元数据。
三、role 的制作过程
命名role 的名字为nginx
[root@localhost ~]# mkdir nginx
[root@localhost ~]# mkdir {files,handles,tasks,templates,vars}
[root@localhost ~]# cd nginx/
[root@localhost nginx]# for d in `ls`;
> do
> touch ${d}/main.yml
> done
[root@localhost nginx]# tree
.
├── files
│ └── main.yml
├── handles
│ └── main.yml
├── tasks
│ └── main.yml
├── templates
│ └── main.yml
└── vars
└── main.yml
5 directories, 5 files
files 文件夹存放文件
存放 default.conf 配置文件
handlers 文件夹中的main.yml 文件
[root@localhost nginx]# vim handles/main.yml
---
- name: reload nginx server
service: name=nginx state=reloaded
when:
- nginxsyntax.rc == 0
tasks 文件夹中的 main.yml 文件
---
- name: create user
user: name={{item}} state=present
with_items: "{{ createuser }} "
- name: 传输仓库文件
copy:
src: /home/nginx.repo
dest: /etc/yum.repos.d/nginx.repo
- name: 安装 nginx
yum: name=nginx state=present
- name: 利用模板文件,设置主配置文件
template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
tags: update
notify: reload nginx server
- name: 子配置文件
copy:
src: www.webservers.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
vars 文件夹中的 main.yml 文件
---
createuser:
- tomcat
- www
- mysq
templates中的nginx.conf.j2文件
- worker_processes {{ ansible_processor_vcpus }};
- add_header x-hostname {{ ansible_hostname }};
四、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"