roles可以结构化的组织playbook,
变量文件,tasks,handlers等分别放至不同的文件夹
使用roles需要在playbook中引用include指令即可
使用roles需要创建一个roles目录,目录存放地方自定义,默认是在/etc/ansible/roles,
palybook中需要引用roles,playbook需要和roles目录处于平级
创建几个自定义的角色,最好有实意,必须要创建在roles目录下
mkdir -p /etc/ansible/roles/{httpd,mysql,nginx}
roles各目录作用:这些目录需要创建在{httpd,mysql,nginx},目录下
创建顺序为:roles ==》 角色名 ==》 需要用到的目录及文件
files:存放需要copy模块或script模块调用的目录,
tempaltes:template模块块调用的目录,用来存放 .j2文件
tasks:定义task,role的基本元素,至少需要一个名为main.yml文件(必须有)
handlers:至少需要一个名为main.yml文件
vars:定义变量,至少需要一个名为main.yml文件
meta:定义当前角色的特殊设定及其依赖关系,至少需要一个名为main.yml文件
default:设定默认变量时使用此目录中的main.yml文件
示例
任务目标:用roles安装nginx
需要: 模块名
1.创建nginx组, group
2.创建nginx用户, user
3.安装nginx, yum
4.调用template模板*.conf.j2 template
5.启动nginx, service
双十二阿里云特价优惠链接
根据上述需求,我们需要在roles/nginx下创建目录:tasks,templates
mkdir -p /etc/ansible/roles/nginx/{tasks,templates}
分别将部署步骤写出来
因为roles是结构化,所以tasks目录下只需要写tasks即可
编写task语句
cat roles/nginx/tasks/group.yml #创建组
- name: add group
group: name=nginx gid=80
cat roles/nginx/tasks/user.yml #创建系统用户
- name: add user
user: name=nginx groups=nginx system=yes shell=/sbin/nologin uid=80
cat roles/nginx/tasks/install_package.yml #开始安装包
- name: install package
yum: name=nginx state=latest
cat roles/nginx/tasks/template.yml #用template将配置文件复制过去
- name: copy configuration
template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf backup=yes
notify: change #添加了handler,触发条件
cat roles/nginx/tasks/service.yml #启动服务
up service
service: name=nginx state=restarted enabled=yes
cat roles/nginx/tasks/main.yml #给前面写的文件进行排序
- include: group.yml #根据排版顺序执行task
- include: user.yml
- include: install_package.yml
- include: template.yml
- include: handler.yml
- include: service.yml
编写handlers触发条件
cat roles/nginx/handlers/main.yml # 触发动作
- name: change # 匹配notify
service: name=nginx state=reloaded
编写vars变量
cat roles/nginx/vars/main.yml
nginx_port: 80 #自定义变量
mysql_port: 3306
写执行文件,要写在/etc/ansible/下,因为playbook要和roles目录处于同级
cat install_nginx.yml
- hosts: all
remote_user: root
roles:
- role: nginx #nginx就是roles目录下的一个角色
执行roles,先测试 没问题再执行
ansible-playbook -C install_nginx.yml
如果想同时执行两个角色
cat install_nginx.yml
- hosts: all
remote_user: root
roles:
- role: nginx
- role: httpd #添加角色名,并按照顺序执行
如果角色A想调用角色B中的任务
在tasks目录下的main.yml文件中指定要调用的任务路径即可
cat roles/nginx/tasks/main.yml
- include: group.yml
- include: user.yml
- include: install_package.yml
- include: template.yml
- include: service.yml
- include: roles/httpd/tasks/xxx.yml #roles目录下的任务路径
如何给role加tag
给role添加when判断
cat install_nginx.yml
- hosts: all
remote_user: root
roles:
- { role: nginx, tags: ['web','nginx'] }
- { role: httpd, tags: ['web','httpd'],when: ansible_distribution_major_version == "7" }
- { role: app, tags:"app" } #判断句 当系统等7时,执行此role
通过tag来执行role
ansible-playbook -t web install_nginx.yml