Ansible Playbook & Roles

前言

其實ansible有很完整的官方文件可以學習,不過我就把我自己會用的方法寫成筆記給自己做個memo

結構

看ansible官方的文件,一開始都會有一個playbook要包山包海的的念頭,不過不是我在說,一個包山包海的Playbook不僅難寫難維護,還很容易錯,所以我個人會建議盡可能的拆分成一個一個的模組這樣維護上會比較簡單,寫的時候也比較容易

個人喜愛的ansible框架

簡單說明

首先,對於自己的實力以及實際在跑得ansible playbook的效率的平衡,比較複雜的工作我會採用shell script + ansible的方式來進行, 因為是靠已經寫好的shell scripttrigger ansible playbook, 自然也就不用one playbook rule them all的思維來寫Playbook

基於上面的邏輯,所以Playbook自然就會focus在單一目的來編寫減少大量複雜而且容易出錯的條件判斷

在範例中,我會建立一個專門給manajro用的playbook,用途是用來setup我的manjaro desktop, 然而這個Playbook裡面會長這樣

Playbook Level
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
---
- hosts: localhost
connection: local
gather_facts: no
become: true
roles:
- base
- neovim
- desktop
- brave
- fcitx
- ulauncher
- remmina
- marktext
- ssh-key
- wireguard
- kde
- cinnamon
- gnome
- xfce

- hosts: localhost
connection: local
become: true
tasks:
- name: clean up package cache | Archlinux Family
command: pacman -Scc --noconfirm

首先這個playbook裡面有兩個play, 一個定義了一堆roles, 另外一個則是要求清空安裝的cache檔,老實說第二個play是不需要的,真的需要的只有第一個play

第一個play與其他文件上講的差異很大,基本上沒有任何task也沒任何條件判別就是很單純的定義localhost要有這些roles

這裡就是好的地方,因為我可以簡單定義這個所謂的本機需要多少子項在內,然後有重複的子項就可以回收使用

Roles

基本上roles就是一堆task的內容定義,結構是roles/roles_name/filesroles/roles_name/tasks然後會自然呼叫roles/roles_name/tasks/main.yml

1
2
3
4
5
6
7
8
9
10
11
- name: System ZSH Powerlevel & Environment Setting
tags: zsh
become: true
ansible.posix.synchronize: src={{ item.src }} dest={{ item.dest }}
with_items:
- { src: 'files/zshrc', dest: '/root/.zshrc' }
- { src: 'files/zshrc', dest: '/home/kiwi/.zshrc' }
- { src: 'files/tmux.conf', dest: '/home/kiwi/.tmux.conf' }
- { src: 'files/tmux.conf.local', dest: '/home/kiwi/.tmux.conf.local' }
- { src: 'files/tmux.conf', dest: '/root/.tmux.conf' }
- { src: 'files/tmux.conf.local', dest: '/root/.tmux.conf.local' }

簡單提一下,這個roles基本上就是把檔案從files拷貝到本機/remote的某個地方,可以看的出來層級就等於是playbook內的tasks:

另一種呼叫是放在同階層的yml檔案利用語法是

1
2
3
4
5
tasks:
-name:

.....
- inculde: XXX.yml

他就會讀進跟Roles內的yml同階的文件(一樣是- name:開頭的)

結論

若是很單純想要透過模組化來進行重複利用的就用roles功能,或是用inculde機能去載入對應的task item都可以端看寫的人想要怎麼分