開源的自動化配置工具 —— Terraform 實踐分享

開源的自動化配置工具 —— Terraform 實踐分享

Terraform 是一個安全、高效地部署、更改、版本化基礎設施和應用程序的工具,可以用來管理多層次的資源。從上層的軟件配置到底層的網絡、系統配置都可以使用 Terraform 統一進行管理。

關於Terraform 的特性、配置、及應用場景,年前青小云已經和大家分享過了,這裡就不再贅述。今天青小云整理了一些與大家溝通過程中遇到的疑問以及 Terraform 在生產、研發環境中的一些經驗總結,希望對大家有所幫助。

問:什麼是 IaC(Infrastructure as Code),與 DevOps 之間的關係是什麼?

IaC 是實現 DevOps 最佳實踐的關鍵屬性——開發人員更多地參與定義配置,並在開發過程中更早涉足 Ops 團隊。

利用 IaC 的工具可以看到服務器的狀態和配置,並最終為企業內部的用戶提供可視性,旨在將團隊聚合在一起,以最大限度地發揮他們的努力。自動化旨在消除手動過程中的混亂和容易出錯的方面,並使其更加高效,允許更靈活地創建更好的軟件和應用程序,減少停機時間,併為公司提供總體成本效益的方法。基礎設施自動化工具通常包含在 DevOps 工具鏈的組件中。

問:如果一個公司採用基礎設施即代碼的方式的話,他有沒有碰到什麼陷阱的風險?

: 很多基礎設施團隊都使用了雲和自動化技術,卻沒有使用自動化測試和發佈流程,而僅僅是把這種自動化技術當做一種腳本語言來使用。他們同樣也會對每次改動編寫手冊、配置文件和腳本,再針對一部分服務器手工運行他們,也就是說每次改動還是需要大量的人為干預。

這種工作方式意味著基礎設施團隊還是沒有把自己從重複性的勞動中解放出來,他們需要做變更時也沒有減少破壞系統的風險,也沒能對他們的用戶產生幫助。所以還是需要自動化能自動化的一切,並且使用完整的上線流程保證腳本的正確性。

比較推薦的方法是,在腳本使用之前使用 Terraform plan 進行執行情況的預覽,但是有些情況下雖然 plan 是正常的,但是還是沒有辦法正常的執行,所以在實際應用當中應該先進行測試。

一般來講基礎設施產生錯誤造成的損失往往是巨大的。在上線之前也需要進行 code review,在完成了這些步驟之後可以說這些代碼基本是 100% 可靠的。並且儘量要保證每一步只做一小部分修改,這樣比較方便找到腳本的問題,也方便同事進行 review.

問:Terraform 是如何存儲狀態的,在我的團隊當中應該如何去管理這些狀態?

對於單個腳本進行管理多個環境的情況 Terraform 提供了 workspace 功能。使用 workspace 可以利用簡單的判斷語句來修改部分變量的值:

如果只是小型可以利用版本管理工具來進行狀態的存儲,不過使用這種方法有一定的缺點,例如狀態文件中可能包含一些賬號密碼等信息,有人同時對基礎設施進行操作時會造成一定的衝突。

更推薦的方法是使用 remote state 進行狀態的管理,Terraform 的狀態管理支持多種存儲形式如 S3、Consul 等,部分的存儲可以支持狀態鎖以保證只有一個人在執行 Terraform apply.

問:如何將 Terraform 集成到我的項目當中?Terraform 有沒有提供相關的 API?

: 為了方便從代碼中調用 Terraform,可以使用 JSON 形式的配置文件,這樣可以簡化生成配置文件的步驟。

問:在使用 Terraform 的情況下,如何在不停機的情況下進行服務的升級?

答: 在 Terraform 的資源配置當中包含幾個字段可以幫助實現這個功能例如 lifecycle 當中的 create_before_destory,該標誌可以保證在原實例銷燬之前就創建資源進行替換。例如在刪除舊負載均衡器後端的時候可以使用他來創建好後端。

對於有狀態的服務,我們通常使用掛載的硬盤進行狀態的存儲,可以使用 lifecycle 當中的 prevent_destroy 保證 volume 不會被操作失誤刪除,然後將硬盤掛載到新啟動的實例上。

:如何對生產、開發等環境的Terraform腳本進行管理 ?

: Terraform 提供了 workspace 功能可以讓用戶對單個配置目錄生成多個不同的基礎架構資源。默認情況下我們使用的都是名為 default 的工作區,使用 Terraform workspace 子命令可以進行 workspace 的相關操作。

在具體的配置文件當中我們可以使用 ${Terraform.workspace} 取出變量的值,然後進行簡單的判斷來修改部分變量的值。

workspace 是用來管理開發生產之間微小差異的方法,但並不是唯一的隔離機制。

隨著 Terraform 配置文件的增大,使用 remote_state 進行狀態的管理是一個比較推薦的方法。 Terraform 同樣也支持 workspace 機制可以視情況使用。

在 Terraform 的開源社區當中已經明確提出在後續版本當中會加強 workspace 相關的功能,可以將 workspace 與版本管理工具的分支進行關聯。

問:Terraform 如何和配置管理工具比如 Ansible, Puppet 集成?

: Terraform 本身支持 output 變量,可以把創建基礎設施後想要保存的變量進行 output, 再進行適當的處理輸出到配置管理工具當中。

不過更推薦的方法是使用 Terraform-inventory 將 Terraform 的 state 文件直接轉換為 ansible 的 Inventory 文件,然後利用 Inventory 進行 ansible 腳本的使用。

下面是一個開源的項目可以非常方便的 Terraform 的 state 文件轉換為 Inventory 文件,

https://github.com/adammck/Terraform-inventory

同樣 Terraform 有使用 Provisioners 進行幫助初始化機器,其中支持了多種 Provisioners,如 chef、remote_exec 等也可以幫助用戶進行配置管理。

問:如何將多個 Terraform 項目進行關聯?

: 隨著 Terraform 的配置變大,將一個大型的配置文件拆分為多個配置可能會更安全更易用。可以利用 Terraform 的 data resource 讀取其他項目當中的配置。

開源的自動化配置工具 —— Terraform 實踐分享

並且利用 remote_state 可以將狀態設置為 read-only 可以保證最為基礎的設施不會被各個團隊都能進行修改。


分享到:


相關文章: