1. 程式人生 > >Terraform安裝及簡單介紹

Terraform安裝及簡單介紹

Terraform 是什麼?

Terraform 是一種安全有效地構建、更改和版本控制基礎設施的工具(基礎架構自動化的編排工具)。它的目標是 "Write, Plan, and create Infrastructure as Code", 基礎架構即程式碼。Terraform 幾乎可以支援所有市面上能見到的雲服務。具體的說就是可以用程式碼來管理維護 IT 資源,把之前需要手動操作的一部分任務通過程式來自動化的完成,這樣的做的結果非常明顯:高效、不易出錯。

Terraform 提供了對資源和提供者的靈活抽象。該模型允許表示從物理硬體、虛擬機器和容器到電子郵件和 DNS 提供者的所有內容。由於這種靈活性,Terraform 可以用來解決許多不同的問題。這意味著有許多現有的工具與Terraform 的功能重疊。但是需要注意的是,Terraform 與其他系統並不相互排斥。它可以用於管理小到單個應用程式或達到整個資料中心的不同物件。

Terraform 使用配置檔案描述管理的元件(小到單個應用程式,達到整個資料中心)。Terraform 生成一個執行計劃,描述它將做什麼來達到所需的狀態,然後執行它來構建所描述的基礎結構。隨著配置的變化,Terraform 能夠確定發生了什麼變化,並建立可應用的增量執行計劃。

Terraform 是用 Go 語言開發的開源專案,你可以在 github 上訪問到它的原始碼。

Terraform 核心功能

  • 基礎架構即程式碼(Infrastructure as Code)
  • 執行計劃(Execution Plans)
  • 資源圖(Resource Graph)
  • 自動化變更(Change Automation)

基礎架構即程式碼(Infrastructure as Code)
使用高階配置語法來描述基礎架構,這樣就可以對資料中心的藍圖進行版本控制,就像對待其他程式碼一樣對待它。

執行計劃(Execution Plans)
Terraform 有一個 plan 步驟,它生成一個執行計劃。執行計劃顯示了當執行 apply 命令時 Terraform 將做什麼。通過 plan 進行提前檢查,可以使 Terraform 操作真正的基礎結構時避免意外。

資源圖(Resource Graph)
Terraform 構建的所有資源的圖表,它能夠並行地建立和修改任何沒有相互依賴的資源。因此,Terraform 可以高效地構建基礎設施,操作人員也可以通過圖表深入地解其基礎設施中的依賴關係。

自動化變更(Change Automation)
把複雜的變更集應用到基礎設施中,而無需人工互動。通過前面提到的執行計劃和資源圖,我們可以確切地知道 Terraform 將會改變什麼,以什麼順序改變,從而避免許多可能的人為錯誤。

安裝 Terraform

Terraform 的安裝非常簡單,直接把官方提供的二進位制可執行檔案儲存到本地就可以了。比如筆者習慣性的把它儲存到 /usr/local/bin/ 目錄下,當然這個目錄會被新增到 PATH 環境變數中。完成後檢查一下版本號:

通過 -h 選項我們可以看到 terraform 支援的所有命令:

在 Azure 上建立一個 Resource Group

要讓 Terraform 訪問 Azure 訂閱中的資源,需要先建立 Azure service principal,Azure service principa 允許你的 Terraform 指令碼在 Azure 訂閱中配置資源。請參考這裡建立 Azure service principal。

配置 Terraform 環境變數
若要配置 Terraform 使用 Azure service principal,需要設定以下環境變數:

  • ARM_SUBSCRIPTION_ID
  • ARM_CLIENT_ID
  • ARM_CLIENT_SECRET
  • ARM_TENANT_ID
  • ARM_ENVIRONMENT

這些環境變數的值都可以從前面建立 Azure service principal 的過程中獲得。方便起見,我們把設定這些環境變數的步驟可以寫到指令碼檔案 azureEnv.sh 中:

#!/bin/sh
echo "Setting environment variables for Terraform"
export ARM_SUBSCRIPTION_ID=your_subscription_id
export ARM_CLIENT_ID=your_appId
export ARM_CLIENT_SECRET=your_password
export ARM_TENANT_ID=your_tenant_id
# Not needed for public, required for usgovernment, german, china
export ARM_ENVIRONMENT=public

這樣在執行 Terraform 命令前通過 source 命令執行該指令碼就可以了!

建立 Terraform 配置檔案
為了在 Azure 上建立一個 Resource Group,我們建立名稱為 createrg.tf 的配置檔案,並編輯內容如下:

provider "azurerm" {
}
resource "azurerm_resource_group" "rg" {
        name = "NickResourceGroup"
        location = "eastasia"
}

用 init 命令用來初始化工作目錄
把當前目錄切換到 createrg.tf 檔案所在的目錄,然後執行 init 命令:

$ terraform init 

其實就是把 createrg.tf 檔案中指定的驅動程式安裝到當前目錄下的 .terraform 目錄中:

通過 plan 命令檢查配置檔案
plan 命令會檢查配置檔案並生成執行計劃,如果發現配置檔案中有錯誤會直接報錯:

$ . azureEnv.sh
$ terraform plan

通過 plan 命令的輸出,我們可以清楚的看到即將在目標環境中執行的任務。

使用 graph 命令生成視覺化的圖表
其實 graph 命令只能生成相關圖表的資料(dot 格式的資料),我們通過 dot 命令來生成視覺化的圖表,先通過下面���命令安裝 dot 程式:

$ sudo apt install graphviz

然後生成一個圖表:

$ terraform graph | dot -Tsvg > graph.svg

上圖描述了我們通過 azurerm 驅動建立了一個 Resource Group。

使用 apply 命令完成部署操作
在使用 apply 命令執行實際的部署時,預設會先執行 plan 命令並進入互動模式等待使用者確認操作,我們已經執行過 plan 命令了,所以可以使用 -auto-approve 選項跳過這些步驟直接執行部署操作:

$ terraform apply -auto-approve

到 Azure 站點上檢查一下,發現名稱為 NickResourceGroup 的 Resource Group 已經建立成功了。

總結

Terraform 支援的平臺非常多,像 AWS,Azure 等大廠自然是不用說了,一些小的廠商也可以通過提供 provider 支援 Terraform,從而讓整個生態變得非常活躍。如果大家想在 DevOps 實踐中引入基礎設施即程式碼,無論是面對的是公有云還是私有云,相信 Terraform 都不會讓你失望。

參考:
Introduction to Terraform
Terraform github
安裝和配置 Terraform