1. 程式人生 > >Ansible 之 roles使用

Ansible 之 roles使用

ansible roles

1 概述


角色(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使用