roles可以結構化的組織playbook,
變量文件,tasks,handlers等分別放至不同的文件夾
使用roles需要在playbook中引用include指令即可
使用roles需要創(chuàng)建一個roles目錄,目錄存放地方自定義,默認是在/etc/ansible/roles,
palybook中需要引用roles,playbook需要和roles目錄處于平級
創(chuàng)建幾個自定義的角色,最好有實意,必須要創(chuàng)建在roles目錄下
mkdir -p /etc/ansible/roles/{httpd,mysql,nginx}
roles各目錄作用:這些目錄需要創(chuàng)建在{httpd,mysql,nginx},目錄下
創(chuàng)建順序為: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.創(chuàng)建nginx組, group
2.創(chuàng)建nginx用戶, user
3.安裝nginx, yum
4.調用template模板*.conf.j2 template
5.啟動nginx, service
雙十二阿里云特價優(yōu)惠鏈接
根據(jù)上述需求,我們需要在roles/nginx下創(chuàng)建目錄:tasks,templates
mkdir -p /etc/ansible/roles/nginx/{tasks,templates}
分別將部署步驟寫出來
因為roles是結構化,所以tasks目錄下只需要寫tasks即可
編寫task語句
cat roles/nginx/tasks/group.yml #創(chuàng)建組
- name: add group
group: name=nginx gid=80
cat roles/nginx/tasks/user.yml #創(chuàng)建系統(tǒng)用戶
- 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,觸發(fā)條件
cat roles/nginx/tasks/service.yml #啟動服務
up service
service: name=nginx state=restarted enabled=yes
cat roles/nginx/tasks/main.yml #給前面寫的文件進行排序
- include: group.yml #根據(jù)排版順序執(zhí)行task
- include: user.yml
- include: install_package.yml
- include: template.yml
- include: handler.yml
- include: service.yml
編寫handlers觸發(fā)條件
cat roles/nginx/handlers/main.yml # 觸發(fā)動作
- name: change # 匹配notify
service: name=nginx state=reloaded
編寫vars變量
cat roles/nginx/vars/main.yml
nginx_port: 80 #自定義變量
mysql_port: 3306
寫執(zhí)行文件,要寫在/etc/ansible/下,因為playbook要和roles目錄處于同級
cat install_nginx.yml
- hosts: all
remote_user: root
roles:
- role: nginx #nginx就是roles目錄下的一個角色
執(zhí)行roles,先測試 沒問題再執(zhí)行
ansible-playbook -C install_nginx.yml
如果想同時執(zhí)行兩個角色
cat install_nginx.yml
- hosts: all
remote_user: root
roles:
- role: nginx
- role: httpd #添加角色名,并按照順序執(zhí)行
如果角色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" } #判斷句 當系統(tǒng)等7時,執(zhí)行此role
通過tag來執(zhí)行role
ansible-playbook -t web install_nginx.yml