1、简介
- roles 用于层次性、结构化地组织playbook。
- roles 能够根据层次型结构自动装载变量文件、tasks以及handlers等。
- roles 只需要在playbook中使用include指令即可。
简单来讲,roles就是通过分别将变量(vars)、文件(file)、任务(tasks)、模块(modules)及处理器(handlers)放置于单独的目录中,并可以便捷地 include它们的一种机制。角色一般用于基于主机构建服务的场景中,但也可以是用于构建守护进程等场景中
#1. 定义角色存放的路径
[root@hw10 ~]# grep roles /etc/ansible/ansible.cfg
roles_path = /etc/ansible/roles
[root@hw10 www]# ansible-config dump|grep -i roles
DEFAULT_ROLES_PATH(default) = [u'/root/.ansible/roles', u'/usr/share/ansible/roles', u'/etc/ansible/roles']
#2. 角色的集合
# -L 限制目录显示层级
[root@hw10 www]# tree /data/bestcem_install/roles -L 1
/data/bestcem_install/roles
├── app
├── bi
├── init-docker
├── init-env
├── mongo
├── rabbitmq
├── redis
└── web
2、角色目录
2.1 各目录作用
mkdir -pv ./roles/project/{files,templates,vars,tasks,handlers,meta,default}
# -d 显示文件夹,不显示文件
[root@tx12 ~]# tree /root -d
/root
`-- roles
`-- project
|-- default # 设定默认变量时使用此目录中的main.yml文件,比vars的优先级低
|-- files # 存放由copy或script模块等调用的文件
|-- handlers # 此目录中至少应该有一个名为main.yml的文件,用于定义各handler;其它的文件需要由main.yml进行include包含调用
|-- meta # 定义当前角色的特殊设定及其依赖关系;其它的文件需要由main.yml进行include包含调用
|-- tasks # 至少要有一个tasks目录,定义task,role的基本元素,至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含
|-- templates # 存储由template模块调用的模板文本
|-- vars # 此目录用来存储playbook变量,文件名为main.yml,其它文件需要通过include包含
2.2 部署nginx
mkdir -pv /data/ansible/roles/nginx/{tasks,handlers,templates,vars}
#目录结构如下
tree /data/ansible/roles/nginx/
/data/ansible/roles/nginx/
├── handlers
│ └── main.yml
├── tasks
│ ├── config.yml
│ ├── file.yml
│ ├── install.yml
│ ├── main.yml
│ └── service.yml
├── templates
│ ├── nginx7.conf.j2
│ └── nginx8.conf.j2
└── vars
└── main.yml
4 directories, 9 files
###############################################################################
#创建task文件
cd /data/ansible/roles/nginx/
vim tasks/main.yml
- include: install.yml
- include: config.yml
- include: index.yml
- include: service.yml
vim tasks/install.yml
- name: install
yum: name=nginx
vim tasks/config.yml
- name: config file for centos7
template: src=nginx7.conf.j2 dest=/etc/nginx/nginx.conf
when: ansible_distribution_major_version=="7"
notify: restart
- name: config file for centos8
template: src=nginx8.conf.j2 dest=/etc/nginx/nginx.conf
when: ansible_distribution_major_version=="8"
notify: restart
vim tasks/index.yml
- name: index.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
###############################################################################
#创建handler文件
cat handlers/main.yml
- name: restart
service: name=nginx state=restarted
###############################################################################
#创建两个template文件
cat templates/nginx7.conf.j2
...省略...
user {{user}};
worker_processes {{ansible_processor_vcpus+3}}; #修改此行
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
...省略...
cat templates/nginx8.conf.j2
...省略...
user nginx;
worker_processes {{ansible_processor_vcpus**3}}; #修改此行
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
...省略...
###############################################################################
#创建变量文件
vim vars/main.yml
user: daemon
###############################################################################
#在playbook中调用角色
vim /data/ansible/role_nginx.yml
---
#nginx role
- hosts: websrvs
remote_user: root
roles:
- nginx
#运行playbook
ansible-playbook /data/ansible/role_nginx.yml
3、创建 roles
通常创建一个role的方法有两种:
- 命令mkdir和touch行手动创建
- 使用 ansible-galaxy 自动初始化一个 role
[root@tx12 ~]# ansible-galaxy init roles
- Role roles was created successfully
[root@tx12 ~]# ll
total 4
drwxr-xr-x 10 root root 4096 Jun 16 16:30 roles
[root@tx12 ~]# tree roles/
roles/
|-- defaults
| `-- main.yml
|-- files
|-- handlers
| `-- main.yml
|-- meta
| `-- main.yml
|-- README.md
|-- tasks
| `-- main.yml
|-- templates
|-- tests
| |-- inventory
| `-- test.yml
`-- vars
`-- main.yml
8 directories, 8 files
4、role 引用
比较常用的方法,我们可以使用「roles:」语句引用role :
---
- hosts: node1
roles:
- role_A
---
- hosts: node1
roles:
- name: role_A
- name: role_A
---
- hosts: node1
roles:
- role: role_A
- role: role_A
---
# 使用绝对路径
- hosts: node1
roles:
- role: /root/lab-ansible/roles/role_A
# 引入的同时添加变量参数
---
- hosts: node1
roles:
- role: role_A
vars:
name: Maurice
age: 100
# 引入的同时添加tag参数
---
# playbooks/test.yaml
- hosts: node1
roles:
- role: role_B
tags:
- tag_one
- tag_two
# 等价于上面
- { role: role_B, tags:['tag_one','tag_two'] }