在剛開始接觸組態管理工具(Configure Management Tool,或常見譯為配置管理工具)的時候,應該都會經歷過一段日子,就是擔心自己寫的自動化腳本會不會有問題,特別是當腳本要使用在 Production 環境時,總是會再三的確認,深怕自己一個不小心,不但沒省事,反而把 Production 環境搞壞了。
本文簡單地談談在 Ansible 中有哪些小技巧可以幫助你降低這些憂慮,放膽執行您的 playbook。
(本文同步發表於 Medium)
 (Photo by John Schnobrich on Unsplash)
在實際執行 playbook 之前的三個基本 Options
先從 ansible-playbook
指令內建的 Options 開始說起,有三個 Options 是最基本的檢查,分別是:
--syntax-check
--list-tasks
--list-hosts
–syntax-check
首先是 --syntax-check
,它可以用來幫你檢查 playbook 有沒有格式或語法錯誤,不過其實我們不用手動執行它,因為當你執行 ansible-playbook
時,就已預設會先進行語法檢查了。
所以在 --help
中也是這麼說明的。
--syntax-check perform a syntax check on the playbook, but do not execute it
(謎之音:那你還浪費篇幅介紹它。)
對於現代的開發者而言,「語法檢查」通常會跟工程師使用的編輯器、IDE 綁在一起,讓語法檢查能夠自動完成,以 ATOM 為例就有 pacakage - linter-ansible-syntax 可以幫助我們在撰寫 playbook 時即能完成語法檢查。
–list-tasks
第二個 Option 是 --list-tasks
,它可以幫你列出在即將要執行的 playbook 中有哪一些 tasks 會被執行。建議在執行重要的 playbook 之前可以先跑一次 --list-tasks
,複閱是否會執行的皆是你所預期的 tasks。
不過這裡要特別注意,如果 playbook 內含幾種狀況時,則有可能 --list-tasks
會無法完整顯示所有的 tasks。
include_tasks
name
tags
這部分就讓我留到後續的文章介紹 include_tasks
時再解釋了。
–list-hosts
最後是 --list-hosts
,它可以幫你列出目前要執行的 playbook 會在哪些 hosts 上執行。因次同樣也建議在執行重要的 playbook 之前,務必要先跑一次 --list-hosts
,確認自己沒搞錯目標 hosts。
在實際執行 ansible-playbook
時,--list-tasks
及 --list-hosts
可以一起執行,ansible 會貼心的幫你各別顯示。

在嘗試測試 playbook 時可用的 Options
前述三項 Options 都屬於事前檢查的範圍,接著介紹三個屬於「測試」範圍可以使用的 Options,分別是
--check
--diff
--step
–check
--check
即是「Dry Run」,明眼人應該看到這裡就明白這是什麼,因此如果只是想要測試 playbook 的撰寫是否正確,例如驗證某些基於 OS distribution 而執行不同 tasks 的邏輯判斷,就可以利用 --check
進行驗證。
需要注意的是 --check
並不會實際對目標 server 造成異動,因此如果 playbook 中有些邏輯判斷有相依關係,例如下一項 task 必須依據前一項 task 輸出之結果才能繼續執行時,就可能會無法順利運作。
–diff
如果你的 playbook 有針對各種組態檔案進行異動,那麼 --diff
即是你的好夥伴,透過它你可以檢閱 playbook 會對組態檔案進行哪些異動,其結果會用類似下圖的方式呈現。

–step
最後一個 Option 是 --step
。當你希望 playbook 能夠一個又一個 task 慢慢地執行時即可使用它。實際執行的狀況將類似下圖,包含 Gathering Facts
在內的每一個 task,Ansible 都會詢問你是否要執行與是否要繼續執行 playbook,因此也是十分適合用於測試階段的 Option。

同樣在實際執行 ansible-playbook
時,--check
、--diff
及 --step
也是能夠一併使用的,將三者結合同時使用時,你就能一步又一步的驗證 playbook。
小結
基本上只要是經常有在撰寫 playbook 的工程師,應該上述的 Options 都不陌生。在實務上,針對重要的 playbook 或 role 還是會建議要撰寫適當的 testing,並且事先在類似 Production 的環境進行測試與驗證,畢竟當你的 playbook 有比較暴力的 task 或影響之 host 數量超過一定程度時,多一道測試做為你的防護網,能夠有效避免發生慘劇,也能提升你對於自己撰寫之 playbook 的信心。
其他關於安心執行 playbook 及 role 的小技巧,就讓我們留待下回再分曉了。
您是否也有一些使用 Ansible 的小技巧呢?歡迎與我分享您的經驗喔!