Terraform: 基礎設施即程式碼
問題
現如今有很多 IT 系統的基礎設施直接使用了雲廠商提供的服務,假設我們需要構建以下基礎設施:
- VPC 網路
- 虛擬主機
- 負載均衡器
- 資料庫
- 檔案儲存
- ...
那麼在公有云的環境中,我們一般怎麼做?
在雲廠商提供的前端管理頁面上手動操作嗎?
這也太費勁了吧,尤其是當基礎設施越來越多、越來越複雜、以及跨多個雲環境的時候,這些基礎設施的配置和管理便會碰到一個巨大的挑戰。
Terraform
為了解決上述問題,Terrafrom 應運而生。
使用 Terraform ,我們只需要編寫簡單的宣告式程式碼,形如:
...
resource "alicloud_db_instance" "instance" {
engine = "MySQL"
engine_version = "5.6"
instance_type = "rds.mysql.s1.small"
instance_storage = "10"
...
}
然後執行幾個簡單的 terraform 命令便可以輕鬆建立一個阿里雲的資料庫例項。
這就是 Infrastructure as code
基礎設施即程式碼。也就是通過程式碼而不是手動流程來管理和配置基礎設施。
正如其官方文件所述,與手動管理基礎設施相比,使用 Terraform 有以下幾個優勢:
- Terraform 可以輕鬆管理多個雲平臺上的基礎設施。
- 使用人類可讀的宣告式的配置語言,有助於快速編寫基礎設施程式碼。
- Terraform 的狀態允許您在整個部署過程中跟蹤資源更改。
- 可以對這些基礎設施程式碼進行版本控制,從而安全地進行協作。
Provider & Module
你也許會感到困惑,我只是簡單的應用了所寫的宣告式程式碼,怎麼就構建出來了基礎設施,這中間發生了什麼?
其實簡而言之就是 terraform 在執行的過程中內部呼叫了基礎設施平臺提供的 API 。
每個基礎設施平臺都會把對自身資源的操作統一封裝打包成一個 provider 。provider 的概念就好像是程式語言中的一個依賴庫。
在 terraform 中引用 provider :
terraform {
required_providers {
alicloud = {
source = "aliyun/alicloud"
version = "1.161.0"
}
}
}
provider "alicloud" {
# Configuration options
}
我們在寫程式碼的時候經常會把某些可重用的部分剝離出來作為一個模組,而在 terraform 中,對基礎設施的管理也是如此,我們能夠把可重用的 terraform 配置組成 module 模組,我們即可以在我們 local 本地自己編寫模組,也可以直接使用第三方組織好並且公開發布的 remote 模組。
最後
本文只是拋磚引玉罷了,有關 terraform 的更多內容還請參考官方文件及其它資料。