天天看點

ansible-playbook role角色

文章目錄

  • ​​1. 介紹​​
  • ​​2. 建立roles步驟​​
  • ​​3. roles各目錄中檔案​​
  • ​​4. 存儲和查找角色​​
  • ​​5. 使用角色​​
  • ​​5.1 role​​
  • ​​5.1.1 使用 allow_duplicates: true​​
  • ​​5.1.2 使用角色依賴​​
  • ​​5.1.3 多次運作角色依賴性​​
  • ​​5.2 include_role​​
  • ​​5.3 import_role​​

1. 介紹

​Roles​

​​是ansible自​

​1.2​

​​版本引入的新特性,用于層次性,結構化地組織playbook,roles能夠根據層次型結構自動自動裝在變量檔案、tasks以及handlers

等。要使用roles隻需要在playbook中使用include指令即可。簡單來講,roles就是通過分别将變量、檔案、任務、模闆及處理器放置于單獨的目錄中

并可以便捷地include他們的一種機制,角色一般用于主機建構服務的場景中,但也可以是用于建構守護程序等場景中。

2. 建立roles步驟

  • 建立以roles命名的目錄:
  • 在roles目錄中分别建立以各角色名稱命名的目錄,如webservers等:
  • 在每個角色命名的目錄中分别建立files、handlers、meta、tasks、templates和vars目錄:用不到的目錄可以建立為空目錄,也可以不建立。
  • 在playbook檔案中,調用各角色

3. roles各目錄中檔案

  1. ​tasks​

    ​​目錄:至少建立一個名為main.yml的檔案,tasks/main.yml -角色執行的主要任務清單:此檔案可以使用 ​

    ​include​

    ​包含其他的位于此目錄中的tasks檔案;
  2. ​files​

    ​目錄:存放由copy或者script等子產品調用的檔案;
  3. ​templates​

    ​目錄:templates子產品會自動在此目錄中尋找Jinjia2模闆檔案;
  4. ​handlers​

    ​目錄:handlers/main.yml -處理程式,可以在此角色内部或外部使用;
  5. ​yml​

    ​​檔案:用于定義此角色用到的各handler:在handler中使用include包含的其他的

    handler檔案也應該位于此目錄中;

  6. ​vars​

    ​目錄:應當包含一個main.yml檔案,用于定義此角色用到的變量
  7. ​meta​

    ​​目錄:應當包含一個main.yml檔案,用于定義此角色的特殊設定及其依賴關系:​

    ​ansible 1.3​

    ​及其以後的版本才支援
  8. ​default​

    ​目錄:defaults/main.yml-角色的預設變量,這些變量在所有可用變量中具有最低的優先級,并且很容易被其他任何變量(包括庫存變量)覆寫。
  9. library/my_module.py-子產品,可以在該角色中使用(有關更多資訊,請參見在子產品中嵌入子產品和插件)。

roles:

(1)目錄名同角色名
(2)目錄結構有固定格式:
(3) files:靜态檔案
(4) templates:Jinjia2 模闆檔案
(5) tasks:至少有一個main.yml檔案,定義tasks:
(6)  hangdlers:至少有一個main.yml檔案,定義各handlers
(7) vars:至少有一個main.yml檔案,定義變量
(8)  meta:定義依賴關系等資訊
      

下面是一個role的目錄結構

# playbooks
site.yml
webservers.yml
fooservers.yml
roles/
    common/
        tasks/
        handlers/
        library/
        files/
        templates/
        vars/
        defaults/
        meta/
    webservers/
        tasks/
        defaults/
        meta/      

4. 存儲和查找角色

預設情況下,Ansible在兩個位置查找角色:

roles/相對于劇本檔案位于名為的目錄中

在 ​

​/etc/ansible/roles​

如果您将角色存儲在其他位置,請設定role_path配置選項,以便Ansible可以找到您的角色。将共享角色檢入一個位置可以使它們更容易在多個劇本中使用。有關在ansible.cfg中管理設定的詳細資訊,請參見配置Ansible。

或者,您可以使用完全限定的路徑來調用角色:

---
- hosts: webservers
  roles:
    - role: '/path/to/my/roles/common'      

或者

---
- hosts: webservers
  roles:
    - { role: '/path/to/my/roles/common' }      

5. 使用角色

您可以通過三種方式使用角色:

  1. 在播放級别具有以下roles選項:這是在播放中使用角色的經典方法。
  2. 在任務級别上使用​

    ​include_role​

    ​:您可以在tasks播放區域的任何地方使用include_role。
  3. 在任務級别上使用​

    ​import_role​

    ​:您可以在tasks劇本部分的任何位置靜态重用角色import_role。

5.1 role

使用角色的經典(原始)方法是roles給定播放的選項:

---
- hosts: webservers
  roles:
    - foo
    - bar
    - foo      

roles在播放級别使用該選項時,對于每個角色“ x”:

  • 如果存在​

    ​role / x / tasks / main.yml​

    ​,則Ansible将該檔案中的任務添加到播放中。
  • 如果存在​

    ​role / x / handlers / main.yml​

    ​,則Ansible将該檔案中的處理程式添加到播放中。

如果存在role / x / vars / main.yml,則Ansible将該檔案中的變量添加到播放中。

  • 如果存在​

    ​role / x / defaults / main.yml​

    ​,則Ansible将該檔案中的變量添加到播放中。
  • 如果存在role / x / meta / main.yml,則Ansible将該檔案中的所有角色依賴項添加到角色清單中。
  • (在角色中)任何副本,腳本,模闆或包含任務都可以引用role / x / {檔案,模闆,任務} /(目錄取決于任務)中的檔案,而不必相對或絕對地進行路徑設定。

當您roles在播放級别使用該選項時,Ansible會将角色視為靜态導入,并在劇本解析過程中對其進行處理。Ansible按以下順序執行您的劇本:

  1. pre_tasks戲劇中定義的任何内容。
  2. 由pre_tasks觸發的任何處理程式。
  3. 每個角色roles:,按列出的順序列出。​

    ​meta/main.yml​

    ​首先運作角色中定義的任何角色依賴關系,但要遵循标簽過濾和條件。有關更多詳細資訊,請參見使用角色依賴性。
  4. tasks戲劇中定義的任何内容。
  5. 由角色或任務觸發的任何處理程式。
  6. post_tasks戲劇中定義的任何内容。
  7. 由post_tasks觸發的任何處理程式。
如果對角色中的任務使用标記,請確定還标記您的​

​pre_tasks​

​​,​

​post_tasks​

​​和角色依賴性,并同時傳遞它們,尤其是如果​

​pre / post​

​任務和角色依賴性用于監視中斷視窗控制或負載平衡。有關添加和使用标簽的詳細資訊,請參見标簽。

您可以将其他關鍵字傳遞給該roles選項:

您可以在每個角色定義中傳遞不同的參數,如下所示:

---
- hosts: webservers
  roles:
    - { role: foo, vars: { message: "first" } }
    - { role: foo, vars: { message: "second" } }      

或者

---
- hosts: webservers
  roles:
    - common
    - role: foo_app_instance
      vars:
        dir: '/opt/a'
        app_port: 5000
      tags: typeA
    - role: foo_app_instance
      vars:
        dir: '/opt/b'
        app_port: 5001
      tags: typeB      

将标簽添加到role選項時,Ansible會将标簽應用于角色中的所有任務。

5.1.1 使用 allow_duplicates: true

添加到角色檔案中​

​meta/main.yml​

# playbook.yml
---
- hosts: webservers
  roles:
    - foo
    - foo

# roles/foo/meta/main.yml
---
allow_duplicates: true      

在此示例中,Ansible運作foo兩次,因為我們已明确啟用它。

5.1.2 使用角色依賴

角色依賴性使您可以在使用角色時自動拉入其他角色。當您包含或導入角色時,Ansible不會執行角色依賴性。roles如果要讓Ansible執行角色依賴關系,則必須使用關鍵字。

角色相關性存儲在​

​meta/main.yml​

​角色目錄内的檔案中。此檔案應包含角色和參數的清單,以在指定角色之前插入。例如:

# roles/myapp/meta/main.yml
---
dependencies:
  - role: common
    vars:
      some_parameter: 3
  - role: apache
    vars:
      apache_port: 80
  - role: postgres
    vars:
      dbname: blarg
      other_parameter: 12      

Ansible始終在包含角色依賴項的角色之前執行角色依賴項。Ansible還執行遞歸角色依賴關系。如果一個角色依賴于第二個角色,而第二個角色依賴于第三個角色,則Ansible将執行第三個角色,然後執行第二個角色,然後執行第一個角色

5.1.3 多次運作角色依賴性

Ansible對待重複的角色依賴項就像在下面列出的重複角色一樣roles::Ansible僅執行一次角色依賴項,即使定義了多次,除非角色上定義的參數,标簽或when子句對于每個定義都不同。如果劇本中的兩個角色都将第三個角色列為依賴關系,則除非您傳遞不同的參數,标簽,when子句或在依賴(第三個)角色中使用,否則Ansible僅運作一次該角色依賴關系。

一個命名角色car取決于一個命名角色wheel,如下所示:

---
dependencies:
  - role: wheel
    vars:
      n: 1
  - role: wheel
    vars:
      n: 2
  - role: wheel
    vars:
      n: 3
  - role: wheel
    vars:
      n: 4      

并且wheel角色取決于兩個角色:tire和brake。然後,meta/main.ymlfor輪将包含以下内容:

---
dependencies:
  - role: tire
  - role: brake      

并且​

​meta/main.yml​

​​ ​

​fortire​

​​和​

​brake​

​将包含以下内容:

---
allow_duplicates: true      

執行的結果順序如下:

tire(n=1)
brake(n=1)
wheel(n=1)
tire(n=2)
brake(n=2)
wheel(n=2)
...
car      

要與角色依賴項一起使用,必須為依賴角色而不是父角色指定它。另外,在上述的例子中,出現在的和作用。該角色不需要,因為定義的每個執行個體使用不同的參數值。

5.2 include_role

雖然在roles部分中添加的角色先于劇本中的任何其他任務運作,但包含的角色将按照定義的順序運作。如果某個任務之前還有其他任務​

​include_role​

​,則其他任務将首先運作。

示例1

---
- hosts: webservers
  tasks:
    - name: Print a message
      debug:
        msg: "this task runs before the example role"

    - name: Include the example role
      include_role:
        name: example

    - name: Print a message
      debug:
        msg: "this task runs after the example role"      

示例2:

---
- hosts: webservers
  tasks:
    - name: Include the foo_app_instance role
      include_role:
        name: foo_app_instance
      vars:
        dir: '/opt/a'
        app_port: 5000
      tags: typeA
  ...      

示例3:

您可以有條件地包括一個角色:

---
- hosts: webservers
  tasks:
    - name: Include the some_role role
      include_role:
        name: some_role
      when: "ansible_facts['os_family'] == 'RedHat'"      

5.3 import_role

---
- hosts: webservers
  tasks:
    - name: Print a message
      debug:
        msg: "before we run our role"

    - name: Import the example role
      import_role:
        name: example

    - name: Print a message
      debug:
        msg: "after we ran our role"      
---
- hosts: webservers
  tasks:
    - name: Import the foo_app_instance role
      import_role:
        name: foo_app_instance
      vars:
        dir: '/opt/a'
        app_port: 5000
  ...      

繼續閱讀