1. 程式人生 > >Ansible之roles(角色)詳解

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: webservers
  roles:
     - 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: webservers
  roles:
    - common
    - { role: foo_app_instance, dir: '/opt/a',  port: 5000 }
    - { role: foo_app_instance, dir: '/opt/b',  port: 5001 }

當一些事情不需要頻繁去做時,也可以為 roles 設定觸發條件,像這樣:

---

- hosts: webservers
  roles:
    - { role: some_role, when: "ansible_os_family == 'RedHat'" }

它的工作方式是:將條件子句應用到 role 中的每一個 task 上。

也可以給role分配指定的標籤,比如

---

- hosts: webservers
  roles:
    - { role: foo, tags: ["bar", "baz"] }

如果 play 仍然包含有 ‘tasks’ section,這些 tasks 將在所有 roles 應用完成之後才被執行。

也可定義一些 tasks,讓它們在 roles 之前以及之後執行,可以這樣做:

---

- hosts: webservers

  pre_tasks:
    - shell: echo 'hello'

  roles:
    - { role: some_role }

  tasks:
    - shell: echo 'still busy'

  post_tasks:
    - shell: echo 'goodbye'

關於ansible的角色介紹基本就這些了,在以後工作學習中再遇到相關問題會繼續補充,下邊博文將會針對使用角色一鍵部署靜態網站做演示。

------做運維之前很矯情的小年輕-----