Ansible 之 roles使用
角色(roles):把playbook根據功能,如handler,tasks等分門別類的放在在各自的子目錄下,形成一個集合,就是角色,建議把角色放在固定的目錄下,目錄可以ansible的配置文件中的roles_path來定義。
role模板查看鏈接:https://github.com/ansible/ansible-examples
2 配置介紹
以層級結構組織Playbook的核心元素,成為roles。
核心元素包括以下幾點:
Hosts:主機
Tasks:任務列表
Variables:變量
Templates:包含了模板語法的文本文件;
Handlers:由特定條件觸發的任務;
在roles目錄下,分別創建不同的目錄,每個目錄就是不同的角色,roles目錄下是角色的集合:
如roles/創建如下的目錄
mysql/
httpd/
nginx/
memcached/
roles模塊的路徑可以在配置文件/etc/ansible/ansible.cfg裏roles_path定義.
vim /etc/ansible/ansible.cfg roles_path = /etc/ansible/roles:/usr/share/ansible/roles
每個角色,以特定的層級目錄結構進行組織,例子如下:
/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文件;
3 playbook調用角色
playbook調用角色有三個方法:
方法1:
- hosts: websrvs remote_user: root roles: - mysql - memcached - nginx
方法2:傳遞變量給角色,調用角色時,註意依賴關系,可以自己先考慮好先後順序
- hosts: remote_user: roles: - { role: nginx, username: nginx } #鍵role用於指定角色名稱;後續的k/v用於傳遞變量給角色;
方法3:基於條件測試實現角色調用;
roles: - { role: nginx, when: "ansible_distribution_major_version == '7' " }
4 例子
安裝nginx,並啟用
創建role相關模塊
mkdir -pv /usr/share/ansible/roles/nginx/{tasks,handlers,vars,files,templates}
註意,main.yml是固定的文件名,一定要存在,指明文件名即可,頂格寫
如下,設定一個模塊,
vim /usr/share/ansible/roles/nginx/tasks/main.yml - name: install nginx package yum: name=nginx state=latest - name: start nginx service service: name=nginx enabled=true state=started
調用模塊,一個主機可以調用多個列表
vim /root/ansible/nginxrole.yml - hosts: dbsrvs remote_user: root roles: - nginx
運行
ansible-playbook /root/ansible/nginxrole.yml
完善role裏nginx的模塊,增肌子配置文件,並且設定notify,設置了tag,並且,當子配置文件發送變化,重啟nginx服務
#設置任務文件,註意,配置模板文件的src使用相對路徑即可,目錄的相對路徑是:/usr/share/ansible/roles/nginx/templates/
vim /usr/share/ansible/roles/nginx/tasks/main.yml - name: install nginx package yum: name=nginx state=latest - name: copy nginx conf file tempalte: src=web.conf.j2 dest=/etc/nginx/conf.d/web.conf notify: reload nginx tags: cpfile - name: create docroot dir file: path={{ ngx_doc_root }} state=directory tags: cpfile - name: start nginx service service: name=nginx enabled=true state=started #設置變量,在vars目錄下定義變量,變量不需要橫桿引導 vim /usr/share/ansible/roles/nginx/vars/main.yml ngx_port: 8888 ngx_server_name: www.sunny.com ngx_doc_root: /webdata #設置觸發後執行的操作 vim /usr/share/ansible/roles/nginx/handlers/main.yml - name: reload nginx service: name=nginx state=reloaded #設置模板文件 vim /usr/share/ansible/roles/nginx/templates/web.conf.j2 server { listen {{ ngx_port }}; server_name {{ ngx_server_name }}; location / { root {{ ngx_doc_root }}; } }
#調用模塊
vim /root/ansible/nginxrole.yml - hosts: dbsrvs remote_user: root roles: - nginx
測試模塊
ansible-playbook -C /root/ansible/nginxrole.yml
註意,由於測試沒有實際安裝nginx模塊,因此測試時,啟動服務會失敗
執行模塊
ansible-playbook /root/ansible/nginxrole.yml
執行tag cpfile對應的代碼,如果文件web.conf.j2 發生變化,包括定義變量的文件發送變化,就會重新服務該文件到對應機器,同時,notify生效,重啟nginx服務
ansible-playbook -t cpfile /root/ansible/nginxrole.yml
在執行命令中執行變量,註意,命令裏的變量優先級比配置再模塊vars下的優先級高
ansible-playbook -t cpfile -e "ngx_port=8899" /root/ansible/nginxrole.yml
Ansible 之 roles使用