Ansible之roles(角色)详解
roles介紹
角色(roles)是ansible自1.2版本開始引入的新特性,用于層次性,結(jié)構(gòu)化地組織playbook。roles能夠根據(jù)層次型結(jié)構(gòu)自動裝載變量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可。簡單的說,roles就是通過分別將變量、文件、任務(wù)、模塊及處理器放置于單獨的目錄中、并可以便捷地include他們的一種機制。角色一般用于基于主機構(gòu)建服務(wù)的場景中、但也可以是用于構(gòu)建守護進程等場景中。
一個項目的目錄結(jié)構(gòu)
site.yml webservers.yml fooservers.yml roles/common/files/templates/tasks/handlers/vars/defaults/meta/webservers/files/templates/tasks/handlers/vars/defaults/meta/- yml文件,用于定義此角色用到的各handler:在handler中使用include包含的其他的handler文件也應(yīng)該位于此目錄中;
 - files目錄:存放由copy或script等模塊調(diào)用的文件;
 - templates目錄:templates模塊會自動在此目錄中尋找Jinja2模板文件;
 - tasks目錄:至少應(yīng)該包含一個名為main.yml的文件,其定義了此角色的任務(wù)列表;此文件可以使用include包含其他的位于此目錄中的task文件;
 - handlers目錄:此目錄中應(yīng)當包含一個main;
 - vars目錄:應(yīng)當包含一個main.yml文件,用于定義此角色用到的變量;
 - meta目錄:應(yīng)當包含一個main.yml文件,用于定義此角色的特殊設(shè)定及其依賴關(guān)系;ansible 1.3及其以后的版本才支持
 - default目錄:為當前角色設(shè)定默認變量時使用此目錄;應(yīng)當包含一個main.yml文件;
 
那么一個playbook就可以這樣寫
---- hosts: webserversroles:- common- webservers這個 playbook 為一個角色 ‘x’ 指定了如下的行為:
- 如果 roles/x/tasks/main.yml 存在, 其中列出的 tasks 將被添加到 play 中
 - 如果roles/x/handlers/main.yml 存在, 其中列出的 handlers 將被添加到 play 中
 - 如果roles/x/vars/main.yml 存在, 其中列出的 variables 將被添加到 play 中
 - 如果roles/x/meta/main.yml 存在, 其中列出的 “角色依賴” 將被添加到 roles 列表中 (1.3 andlater)
 - 所有 copy tasks 可以引用 roles/x/files/ 中的文件,不需要指明文件的路徑。
 - 所有 scripttasks 可以引用 roles/x/files/ 中的腳本,不需要指明文件的路徑。
 - 所有 template tasks 可以引用roles/x/templates/ 中的文件,不需要指明文件的路徑。
 - 所有 include tasks 可以引用roles/x/tasks/ 中的文件,不需要指明文件的路徑。
 
如果 roles 目錄下有文件不存在,這些文件將被忽略。比如 roles 目錄下面缺少了 ‘vars/’ 目錄,這也沒關(guān)系。
注意:你仍然可以在 playbook 中松散地列出 tasks,vars_files 以及 handlers,這種方式仍然可用,但 roles 是一種很好的具有組織性的功能特性,我們強烈建議使用它。如果你在 playbook 中同時使用 roles 和 tasks,vars_files 或者 handlers,roles 將優(yōu)先執(zhí)行。
而且,也可以使用參數(shù)化的 roles,這種方式通過添加變量來實現(xiàn),比如:
---- hosts: webserversroles:- common- { role: foo_app_instance, dir: '/opt/a', port: 5000 }- { role: foo_app_instance, dir: '/opt/b', port: 5001 }當一些事情不需要頻繁去做時,也可以為 roles 設(shè)置觸發(fā)條件,像這樣:
---- hosts: webserversroles:- { role: some_role, when: "ansible_os_family == 'RedHat'" }它的工作方式是:將條件子句應(yīng)用到 role 中的每一個 task 上。
也可以給role分配指定的標簽,比如
---- hosts: webserversroles:- { role: foo, tags: ["bar", "baz"] }如果 play 仍然包含有 ‘tasks’ section,這些 tasks 將在所有 roles 應(yīng)用完成之后才被執(zhí)行。
也可定義一些 tasks,讓它們在 roles 之前以及之后執(zhí)行,可以這樣做:
---- hosts: webserverspre_tasks:- shell: echo 'hello'roles:- { role: some_role }tasks:- shell: echo 'still busy'post_tasks:- shell: echo 'goodbye'關(guān)于ansible的角色介紹基本就這些了,在以后工作學習中再遇到相關(guān)問題會繼續(xù)補充,下邊博文將會針對使用角色一鍵部署靜態(tài)網(wǎng)站做演示。
------做運維之前很矯情的小年輕-----
總結(jié)
以上是生活随笔為你收集整理的Ansible之roles(角色)详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 基于Nginx的负载均衡
 - 下一篇: Ansible之使用角色一键部署http