1 概述
角色(roles):如果我們使用playbook寫成一個文件,這個文件會很大,但是不方便組織,我們可以分組,把playbook根據功能,如handler,tasks等分門別類的放在在各自的子目錄下,形成一個集合,就是角色,建議把角色放在固定的目錄下,目錄可以ansible的配置文件中的roles_path來定義。
參考: http://www.ansible.com.cn/docs/playbooks_roles.html
https://blog.51cto.com/ghbsunny/2047084
2 配置介紹
以層級結構組織Playbook的核心元素,成為roles。
核心元素包括以下幾點:
Hosts:主機
Tasks:任務列表
Variables:變量
Templates:包含了模板語法的文本文件;
Handlers:由特定條件觸發的任務;
在roles目錄下,分別創建不同的目錄,每個目錄就是不同的角色,roles目錄下是角色的集合:
如roles/創建如下的目錄
mysql/
httpd/
nginx/
memcached/
roles模塊的路徑可以在配置文件/etc/ansible/ansible.cfg里roles_path定義.
每個角色,以特定的層級目錄結構進行組織,例子如下:
/roles/mysql/
- files/ :存放由copy或script模塊等調用的文件;
- templates/:template模塊查找所需要模板文件的目錄;
- tasks/:至少應該包含一個名為main.yml的文件;其它的文件需要在此文件中通過include進行包含;
- handlers/:至少應該包含一個名為main.yml的文件;其它的文件需要在此文件中通過include進行包含;
- vars/:至少應該包含一個名為main.yml的文件;其它的文件需要在此文件中通過include進行包含;
- meta/:至少應該包含一個名為main.yml的文件,定義當前角色的特殊設定及其依賴關系;其它的文件需要在此文件中通過include進行包含;注意,角色和角色之間有依賴關系,如安裝NT,先裝nginx后裝tomcat,一般不需定義,執行我們自己定義好安裝順序即可
- default/:設定默認變量時使用此目錄中的main.yml文件;
nginx/
├── files 靜態文件
├── tasks 任務列表
│ ├── copyfile.yml
│ ├── installnginx.yml
│ ├── main.yml 入口文件
│ └── start.yml
├── templates 模板文件
│ └── nginx.conf
└── vars 變量
└── handlers 被觸發的動作
3 playbook調用角色
playbook調用角色有三個方法:
方法1:
方法2:傳遞變量給角色,調用角色時,注意依賴關系,可以自己先考慮好先后順序
方法3:基於條件測試實現角色調用;
roles:
- { role: nginx, when: "ansible_distribution_major_version == '7' " }
查找順序
roles目錄,對應的文件夾
tasks:先找tasks目錄里面的main.yml文件,看到import_tasks來導入別的yml文件,這個是必須的
templates: 找這個目錄里面的模板文件,在tasks里面是可以用相對路徑來寫
vars:先找main.yml文件,如果找到就找變量替換
hanlers:先找main.yml文件,如果找到,則在tasks里面通過notify來觸發
files: 放的是靜態文件
相互調用
通過import_tasks 來相互調用,roles/role/tasks/taskfile.yml
怎么使用
跟roles同級目錄下,寫nginx。yml文件
- hosts: web
roles:
- nginx
4 例子
創建roles文件夾
mkdir roles
創建nginx, mysql, redis, uwsgi 四個角色
進入一個角色 cd nginx,
創建目錄 mkdir -v {tasks,files,templates,handlers,vars}
nginx/
├──files 靜態文件
├──tasks 任務列表
│ ├──copyfile.yml
│ ├──installnginx.yml
│ ├──main.yml 入口文件
│ └──start.yml
├──templates模板文件
│ └──nginx.conf
└──vars 變量
└──handlers 被觸發的動作
進入tasks cd tasks
1.創建安裝nginx任務 vim installnginx.yaml
-name:installnginx
yum:name=nginx
2.創建拷貝文件任務 vim copyfile.yaml
-name:copyfile
template:src=nginx.confdest=/etc/nginx/nginx.conf
3.創建啟動任務 vim startnginx.yaml
-name:starnginx
service:name=nginxstate=started
4.創建入口文件 vim main.yaml
-import_tasks:installnginx.yaml
-import_tasks:copyfile.yaml
-import_tasks:startnginx.yaml
5.創建觸發handlers文件 (每次修改配置文件后觸發 需要notify ) cd handler
創建入口文件 vim main.yaml
-name:restart
service:name=niginstate=restarted
5.1去tasks目錄中的 拷貝文件任務中 添加notify cd nginx/tasks/ vim copyfile.yaml
-name:copyfile
template:src=nginx.confdest=/etc/nginx/nginx.conf
tags:copyfile
notify:restart
5.2把本機上的nginx配置文件copy到templates中
我的nginx在/opt/nginx1-12/conf/nginx.conf
cp/opt/nginx1-12/conf/nginx.confnginx.conf
6.配置nginx配置文件, (修改核心數,可選) vim nginx.conf
worker_processes{{ansible_processor_vcpus}};
7.跟roles同級的目錄中創建 主role文件 vim nginx.yaml
-hosts:all
roles:
-nginx
8.檢查一下
ansible-playbook--syntax-checknginx.yaml
9.運行