Ansible 小手冊(cè)系列 十(包含和角色)

包含


使用include模塊來包含foo文件

tasks:
  - include: foo.yml

--- foo.yml
- name: test foo
  command: echo foo

include 還允許傳遞變量

- include: wordpress.yml wp_user=timmy
- include: wordpress.yml
  vars:
      wp_user: timmy
      ssh_keys:
        - keys/one.txt
        - keys/two.txt

動(dòng)態(tài)包含


循環(huán)引用3次

- include: foo.yml param={{item}}
  with_items:
  - 1
  - 2
  - 3

還可以使用動(dòng)態(tài)變量引入task文件

- include: "{{inventory_hostname}}.yml"

動(dòng)態(tài)包含的一些限制

? 您不能使用notify來觸發(fā)來自動(dòng)態(tài)包含的處理程序名稱。
? 您不能使用--start-at-task在動(dòng)態(tài)包含內(nèi)的任務(wù)開始執(zhí)行。
? 僅存在于動(dòng)態(tài)包含內(nèi)的標(biāo)記不會(huì)顯示在-list-tags輸出中。
? 只存在于動(dòng)態(tài)包含內(nèi)的任務(wù)將不會(huì)顯示在-list-tasks輸出中。

為了解決上面限制,2.1版本后引入了static

- include: foo.yml
  static: <yes|no|true|false>

默認(rèn)情況下,在Ansible 2.1及更高版本中,include包含符合以下條件時(shí)會(huì)自動(dòng)被視為靜態(tài)而不是動(dòng)態(tài):

  • include不使用任何循環(huán)
  • 包含的文件名不使用任何變量
  • 靜態(tài)選項(xiàng)沒有顯式禁用(即static:no)
  • 強(qiáng)制靜態(tài)包含(見下文)的ansible.cfg選項(xiàng)被禁用

ansible.cfg配置中有兩個(gè)選項(xiàng)可用于靜態(tài)包括:

  • task_includes_static - 將所有在tasks部分中包含的內(nèi)容都設(shè)置為靜態(tài)。
  • handler_includes_static - 強(qiáng)制所有包括在處理程序部分是靜態(tài)的。

這些選項(xiàng)允許用戶強(qiáng)制playbook的行為與他們?cè)?.9.x和之前一樣。

變量包含


include_vars 在task中動(dòng)態(tài)加載yaml或json文件類型中的變量

- include_vars: myvars.yml

根據(jù)操作系統(tǒng)類型加載變量文件,如果找不到,則為默認(rèn)值。

- include_vars: "{{ item }}"
  with_first_found:
   - "{{ ansible_distribution }}.yml"
   - "{{ ansible_os_family }}.yml"
   - "default.yml"

角色 ROLE


角色是基于已知文件結(jié)構(gòu)自動(dòng)加載某些vars_files,任務(wù)和處理程序的方法。 按角色分組內(nèi)容還允許輕松與其他用戶共享角色。

文件結(jié)構(gòu)如下

Paste_Image.png

結(jié)構(gòu)說明

  • site.yml 主要的playbook
  • webservers.yml webservers 得playbook
  • hosts.ini 主機(jī)清單
  • ibrary 如果有任何自定義模塊,將其放在這里(可選)
  • filter_plugins 如果有任何自定義過濾器插件,將其放在這里(可選)
  • 如果group_var/all存在,其中列出的變量將被添加到所有的主機(jī)組中
  • 如果group_var/groupname1存在,其中列出的變量將被添加到groupname1主機(jī)組中-
  • 如果host_vars/hostname1存在,其中列出的變量將被添加到hostname1主機(jī)組中

這個(gè) playbook 為一個(gè)角色 ‘x’ 指定了如下的行為

  • 如果 roles/x/tasks/main.yml 存在, 其中列出的 tasks 將被添加到 play 中
  • 如果 roles/x/handlers/main.yml 存在, 其中列出的 handlers 將被添加到 play 中
  • 如果 roles/x/vars/main.yml 存在, 其中列出的 variables 將被添加到 play 中
  • 如果 roles/ x/defaults /main.yml存在,其中列出的變量將被添加到play 中
  • 如果 roles/x/meta/main.yml 存在, 其中列出的 “角色依賴” 將被添加到 roles 列表中
  • 所有 copy tasks 可以引用 roles/x/files/ 中的文件,不需要指明文件的路徑。
  • 所有 script tasks 可以引用 roles/x/files/ 中的腳本,不需要指明文件的路徑。
  • 所有 template tasks 可以引用 roles/x/templates/ 中的文件,不需要指明文件的路徑。
  • 所有 include tasks 可以引用 roles/x/tasks/ 中的文件,不需要指明文件的路徑。

如果 roles 目錄下有文件不存在,這些文件將被忽略。

這些目錄的加載順序

  1. meta/main.yml
  2. tasks/main.yml
  3. handlers/main.yml
  4. vars/main.yml
  5. defaults/main.yml

如果區(qū)分環(huán)境使用角色,可以使用下列文檔結(jié)構(gòu)

Paste_Image.png
  • production/inventory 主機(jī)清單

** 運(yùn)行playbook**

ansible-playbook -i production site.yml

角色定義


在playbook中定義角色

---
- hosts: webservers
  roles:
     - x

定義角色參數(shù)

---
- hosts: webservers
  roles:
    - { role: x, dir: '/opt/a',  app_port: 5000 }

使用條件判斷,當(dāng)主機(jī)是Redhat時(shí),才執(zhí)行角色任務(wù)

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

定義角色標(biāo)簽

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

定義執(zhí)行角色任務(wù)前后執(zhí)行的動(dòng)作

---
- hosts: webservers

  pre_tasks:
    - shell: echo 'hello'

  roles:
    - { role: some_role }

  tasks:
    - shell: echo 'still busy'

  post_tasks:
    - shell: echo 'goodbye'

pre_tasks里的task在roles執(zhí)行前執(zhí)行的任務(wù)
post_tasks里的task在roles執(zhí)行完成后執(zhí)行的任務(wù)

角色默認(rèn)變量

定義角色默認(rèn)變量,只需在角色目錄中添加一個(gè)defaults/main.yml文件。角色默認(rèn)變量優(yōu)先級(jí)最低。

角色依賴


角色依賴性允許您在使用角色時(shí)自動(dòng)提取其他角色。 角色依賴關(guān)系存儲(chǔ)在角色目錄中包含的meta/main.yml文件中。 此文件應(yīng)包含要在指定角色之前插入的角色和參數(shù)的列表,例如角色/myapp/meta/main.yml中的以下內(nèi)容:

---
dependencies:
  - { role: common, some_parameter: 3 }
  - { role: apache, apache_port: 80 }
  - { role: postgres, dbname: blarg, other_parameter: 12 }
  - { role: '/path/to/common/roles/foo', x: 1 }

** 角色依賴執(zhí)行順序**

角色依賴性始終在包含角色的角色之前執(zhí)行,并且是遞歸的。
如上面內(nèi)容,按照common,apache,postgres,'/path/to/common/roles/foo順序依次執(zhí)行,再執(zhí)行此角色

** 角色依賴嵌套**

默認(rèn)情況下,在添加依賴其他角色的時(shí)候,如果其他角色內(nèi)也有依賴關(guān)系,是不執(zhí)行其他角色內(nèi)的依賴關(guān)系的。

可以通過allow_duplicates: yes設(shè)置來實(shí)現(xiàn)執(zhí)行其他角色內(nèi)的依賴關(guān)系。

實(shí)際測試,2.1,2.2版本的ansible,無論加不加這個(gè)設(shè)置,就只會(huì)執(zhí)行第一次依賴角色,后續(xù)的則不執(zhí)行。

Paste_Image.png

例子


ansible examples :https://github.com/ansible/ansible-examples


更多文章請(qǐng)看 Ansible 專題文章總覽

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容