一、 roles简介
自1.2版本引入的新特性,用于层次性、结构化地组织playbook。roles能够根据层次型结构自动装载变量文件、tasks以及handlers等,只需要在playbook中使用include指令即可。
简单来讲,roles就是通过分别将变量、文件、任务、模板及处理器放置于单独的目录中,并通过include调用它们的一种机制,类似于其他开发语言中的项目。
二、roles目录结构
每个角色,以特定的层级目录结构进行组织
Roles各目录作用
- roles/project/:项目名称,有以下子目录
- files/ :存放由copy或script模块等调用的文件
- templates/:template模块查找所需要模板文件的目录
- tasks/:定义task,role的基本元素,至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含
- handlers/:定义handlers,至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含
- vars/:定义变量,至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含
- meta/:定义当前角色的特殊设定及其依赖关系,至少应该包含一个名为main.yml的文件;其它文件需在此文件中通过include进行包含
- default/:设定默认变量时使用此目录中的main.yml文件
三、 创建role
1. 创建步骤
- 创建以roles命名的目录
- 在roles目录中分别创建以各角色名称命名的目录,如webservers等
- 在每个角色命名的目录中分别创建files、handlers、meta、tasks、templates和vars目录;用不到的目录可以创建为空目录,也可以不创建
- 在playbook文件中,调用各角色
2. 实验:创建nginx roles
示例:建立nginx roles,在多台主机上部署nginx
- 创建nginx角色目录
cd /app/ansible/role
mkdir nginx{tesks,templates,hanslers} -pv
- 创建任务目录
cd tasks/
touch insatll.yml config.yml service.yml file.yml user.yml
- 创建main.yml文件,定义任务执行顺序
vim main.yml
- include: user.yml
- include: insatll.yml
- include: config.yml
- include: file.yml
- include: service.yml
- 准备配置文件(centos7,8)
ll /app/ansible/role/nginx/templates/
nginx7.conf.j2
nginx8.conf.j2
- 定义任务
vim tasks/install.yml
- name: install
yum: name=nginx
vim tasks/config.yml
- name: config file
template: src=nginx7.conf.j2 dest=/etc/nginx/nginx.conf
when: ansible_distribution_major_version=="7"
notify: restrat
- name: config file
template: src=nginx8.conf.j2 dest=/etc/nginx/nginx.conf
when: ansible_distribution_major_version=="8"
notify: restrat
vim tasks/file.yml
- name: file.html
copy: src=roles/httpd/files/index.html dest=/usr/share/nginx/html/
vim tasks/service.yml
- name: start service
service: name=nginx state=started enabled=yes
vim handlers/main.yml
- name: restrat
service: name=nginx state=restarted
vim roles/role_nginx.yml
---
#test role
- hosts: appsrvs
roles:
- role: nginx
- 测试安装
ansible-playbook role_nginx.yml
四、 playbook调用角色
1. 方法1
vim main.yml
---
- hosts: websrvs
remote_user: root
roles:
- mysql
- memcached
- nginx
2. 方法2
传递变量给角色
vim main.yml
---
- hosts:
remote_user:
roles:
- mysql
- { role: nginx, username: nginx }
# 不同的角色调用不同的变量,键role用于指定角色名称,后续的k/v用于传递变量给角色
例2
---
- hosts: webservers
roles:
- common
- { role: foo_app_instance, dir: '/web/htdocs/a.com', port: 8080 }
3. 方法3
还可基于条件测试实现角色调用
roles:
- { role: nginx, username: nginx, when: ansible_distribution_major_version == '7' }
参考:
《ansible权威指南》