怎麼無痛升級 Ansible

昨天,是凍仁參加 DevOps Taiwan Meetup #13 Ansible User 小聚,並擔任閃電秀講者的日子。還記得 2 年前,剛入門 Ansible 時,凍仁一直很想參加 Ansible 小聚,好親自與前輩們討教,降低學習門壏;2 年後,凍仁有幸能與大家分享些心得。

會有「怎麼無痛升級 Ansible」這個主題,一來是因為 Ansible 的進版速度很快;二來是在工作上,踩到 yum module 從 Ansible 2.4 新加的 allow_downgrade 參數有 bug,不得不即早將 Ansible 2.5 投入實戰。


▲ 04/28 於 DevOps Taiwan Meetup #13 Ansible User 小聚分享的簡報。

這次的簡報,主要以「身為 Ansible Playbooks 的開發者,
我希望 Playbooks 可以支援最新的 Ansible,因為我想在開發、測試和
正式環境上,無痛使用最新版的
Ansible 2.5.0。」這個使用者故事 (User Story) 作為起點。並依序以這 3 個步驟進行:

1. 使用最新的 Ansible 進行語法檢查 (Syntax Check with latest Ansible)。
2. 更換軟體生產線的 Ansible Docker image (Change Ansible Docker image on Pipeline)。
3. 升級各個環境的 Ansible (Upgrade Ansible 2.5 on each environment)。

如果大家還有多餘的資源,不妨也試著導入 Ansible-lint!它可說是 Ansible 最佳實踐的語法檢查器,就好比 Python 的 PEP 8

在台上分享的過程中,沒法很好的回答與會者的提問題,就藉此文補充了:

1. 除了使用 --syntax-check 的參數進行語法檢查外,為什麼不用 Dry run 的 --check 呢?

關於 Ansible 的測試技巧,可以看看正瑋所撰寫的「讓您安心執行 Ansible playbook 的小技巧(1)| 艦長,你有事嗎?」,裡面詳細的介紹了 --syntax-check--check 的差別。前者只會進行靜態語法檢查;而後者雖可驗證邏輯判斷,但同時也需環境支援、解決邏輯相依 tasks 問題等需耗費較大的資源 (resource) 才可進行。

以凍仁目前部門的工作量,光是確保每份 playbooks 都要通過語法檢查 (Syntax Check) 和 ansible-lint 等靜態檢查,就有些困難了。或許在不久的將來,我們除了可以加入用 docker build 驗證 run-time 結果外,還可加入 Dry run 機制的 stage。

2. 如果部署的過程中有問題,會怎麼處理?

如果是有導入 CI (如 GitLab CI、Jenkins CI 或 Travis CI),我會請團隊成員先重試 (re-try) 有問題的 job (工作流程),還是不行再人工介入。如果是網路瞬斷、DNS 臨時找不到等環境問題,通常可以在 re-try 後成功執行。

Ansible 是個很棒的工具,但能自動化到多少,就得看公司政策了。實務上,我們是難以達到 100% 的自動化,其造成的原因很多,如撰寫 playbooks 時沒有完整的文件 (或根本就沒有文件)、時時變動的需求,或臨時性的例外狀況。

比起追求 100% 自動化,不妨先思考如何在短期取得最高的價值。以在下的團隊為例,最先完成的 playbook,其實是每台機器都會用到的 Base playbook,其包含切換套件伺服器位址、網路校時、安裝監控 agent 等。來不及寫成 playbook 的流程,就只好請同事先手動操作了。

理想中,當一個服務出了問題,我們要可以很快速的用 playbook 在另一台新機器重建它,把它投入戰場,之後撤下傷兵;可現實總是殘酷的!

3. 怎麼控制版本?

對於 Ansible playbooks 本身,我會用 requirements.yml 控制 Roles 的版本,然後用 Git 和 release 的版號進行環境的對應。應用程式服務 (Application) 部份,則建議使用 deb、rpm 這類打包好的封裝檔進行安裝,這樣當服務有問題時,才可以用最快的時間進行降版。

這題可是大哉問,下次應該多問一句:「這裡指的版本是哪方面的版本」好深入真正的問題。

A post shared by Chu-Siang Lai (@chusiang.lai) on

最後,凍仁要謝謝出租場地的 Gandi 公司,參與籌備活動的正瑋、Daniel、一格,協助拍攝和當一日褓母的 Violet,熱情的閃電秀講者,和每一位與會者。因為有你們,才有這一場睽違二年的 Ansible 小聚啊!

▲ 超過 30 人的 Ansible user 小聚。

資料來源:
怎麼無痛升級 Ansible | Speaker Deck
怎麼無痛升級 Ansible | SlideShare
chusiang.php7 | Ansible Galaxy
chusiang/php7.ansible.role | GitHub
chusiang/php7.ansible.role | Travis CI

相關連結:
Ansible Porting Guides | Ansible Documentation
DevOps Taiwan Meetup #13 Ansible User 小聚 | KKTIX
加速你的 Ansible by Eric Wang | Speaker Deck
Deploy HDFS cluster via Ansible by 陳均豪 | Google Presentation
跟著 geerlingguy 大神 一起測試 Ansible Roles by 陳正瑋 | SlideShare

留言

  1. 就在凍仁完成這篇文章的前一天,Ansible 2.5.2 釋出了!接下來又得跑過一輪升版流程了。

    > https://github.com/ansible/ansible/releases/tag/v2.5.2

    回覆刪除

張貼留言

喜歡這篇文章嗎?歡迎在底下留言讓凍仁知道。😉

Popular Articles

MySQL 語法匯整