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