相信有那麼一天,我們將可以像畢凱艦長一樣用嘴巴叫所有主機做事!


Cheng Wei Chen



讓您安心執行 Ansible playbook 的小技巧(1)

在剛開始接觸組態管理工具(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 的小技巧呢?歡迎與我分享您的經驗喔!

相關連結


沒有留言:

張貼留言

不歡迎留言打廣告,所以有進行留言管理,敬請見諒。