include roles or tasks

前言

利用這裡講的include_rolesinclude_tasks搭配後面講的變數可以作到針對node的特性動態載入需要的roles/tasks

使用模組與時機

基本上include_rolesinclude_tasks是類似的模組,可以搭配簡單的when條件載入,也可以透過Jinja2的變數動態載入對應的roles或是tasks
這樣的描述比較難以理解,搭配一段隨意寫的範例說明一下

playbook.yml中使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 這是一個play book

---
- name: 範例
hosts: network # 針對network node群組
become: true # 使用root運行
vars_files: # 定義變數檔案
- [ "vars/{{ ansible_facts['os_family'] }}.yml", "vars/default.yml" ] # 在vars/裡面檔名為os_family.yml的檔案例如Archlinux.yml之類的
roles:
- ansible.builtin.include_roles: common # 當滿足系統類別為Archlinux時動態載入common這個role
when: ansible_facts['os_family'] == Archlinux
tasks:
- ansible.builtin.include_tasks: "{{ systemupdate }}" # 載入定義在Archlinux.yml之類檔案內的systemupdate變數所定義的tasks.yml
- ansible.builtin.include_tasks: roles/common/tasks/yay-update.yml # 直接指定跑某一個位置的tasks.yml

由上面的案例可以看得出來,include的tasks只要標清楚相對目錄位置,就可以引用不同地方的tasks來直接用,例子裡就是引用了common這個role裡面的一個子tasks-yay-update.yml

roles/<role_name>/tasks/main.yml中載入

1
2
3
4
# 在roles/<role>/tasks/main.yml中只能導入tasks, 下列案例是非OCI的VPS時才執行account變數對應的tasks.yml
- name: 範例
ansible.builtin.tasks: "{{ account }}""
when: ansible_facts['chassis_asset_tag'] != "OracleCloud.com"

在這個範例裡面,由於playbook內已經定義了變數所以可以直接用"{{ }}"導引的變數去跑

結語

由上述來看,可以透過支解roles內的小tasks或是把獨立的小tasks放在固定的地方,然後透過include_tasks來重複利用就可以減少大量重複機能的source code編寫
而且也可以讓ansible的行為更有彈性

而且編寫上也不用落落長的寫一個檔案,debug的時候很累