如何在 Playbooks 使用 loops?
18. 如何在 Playbooks 使用 loops?
在 Shell Script 裡,我們會使用 for 和 while 等迴圈 (loop) 來簡化重複的程式碼,而在 Ansible 我們也可用 loop 來簡化重複的任務 (Tasks)。以下凍仁將介紹常見的 loop 語法。
▲ 圖片來源:http://screencastsolutions.ca/looping-for-continuous-play/ 。
標準迴圈 (Standard Loops)
首先讓我們以簡單的重複印出 3 筆訊息為例。
Shell Script
先複習一下 Shell Script 的寫法。
建立 for loop 的 Script。
#!/bin/bash $ vi bash_loop.sh for X in 0 1 2; do echo Loop $X done在第 3 行,我們用了
for,並代入了 0, 1, 2 三個值到$X變數。在第 4 行時,則用了
echo,印出訊息和$X變數。
執行 Script:可以看到底下跑了 3 次的 loop。
$ ./bash_loop.sh Loop 0 Loop 1 Loop 2
Ansible Playbooks
我們需透過 item 和 with_items 來使用 Ansible 的 loop,其 item 為預設名,一般情況下不可修改。
在 Ansible 2.1 新增了 Loop Control 的語法,可透過
loop_control和loop_var來自訂 item 的名字,這在多重 loop 等較複雜的環境下會有很大的幫助。
建立 loop 的 playbook。
註:
raw和endraw是為了相容 GitBook 所增加的語法,您可能會在某平台上看到它,請忽略之。在第 7, 8 行裡,我們用了
debugmodule 來印出訊息,並定義item。在第 9 ~ 12 行裡,則用了
with_items將 0, 1, 2 的值傳入item。
執行 Playbook:可以看到
print loop messagetask 跑了 3 次的 loop。凍仁常用此手法來安裝多個套件,接著以建立
chusiang/ansible-jupyterDocker image 的 setup_jupyter.yml 為例。註:
raw和endraw是為了相容 GitBook 所增加的語法,您可能會在某平台上看到它,請忽略之。在第 6, 15, 20 行裡,分別宣告
same_packages,apk_packages和apt_packages變數,並傳入了幾個套件名稱。在第 26, 27, 34, 35, 42, 43 行裡,定義了
item,並將same_packages變數傳入。換句話說就是install same packagestask 會安裝same_packages定義的所有套件。由於此例中 apk, apt 的套件名稱皆相同,故在第 20 行用了
apt_packages: "{{ apk_packages }}"的手法讓apt_packages = apk_packages。
進階迴圈 (Advanced Loops)
如有數個變數需求,可用 item.first, item.second 類似屬性的方式定義 items。
建立擁有兩個 item 屬性的 loop 的 playbook。
註:
raw和endraw是為了相容 GitBook 所增加的語法,您可能會在某平台上看到它,請忽略之。執行 Playbook:這次除了跑 3 次 loop 以外,還代入
num和str屬性的 items。這部份在新增多個使用者、多個軟連結 (soft link) 時都會用到。
註:
raw和endraw是為了相容 GitBook 所增加的語法,您可能會在某平台上看到它,請忽略之。第 8 行的
src的絕對路徑會因環境而有變動,還請特別留意一下。
後語
以個人經驗而言,掌握這兩個技巧就可以解決大多的迴圈需求!若想深入了解這部份,請研讀官方的 Loops | Ansible Documentation 文件 。
相關連結
在友人的提醒下補了行號以利閱讀,若想複製該範例,請直接上 GitHub 取用。
Last updated
Was this helpful?