Terraform 可啟用雲端基礎結構的定義、預覽和部署。 使用 Terraform,您可以使用 HCL 語法建立組態檔。 HCL 語法可讓您指定雲端提供者,例如 Azure,以及構成雲端基礎結構的專案。 建立組態檔之後,您會建立一個 執行計劃 ,讓您在部署基礎結構變更之前先預覽這些變更。 驗證變更之後,您會套用執行計劃來部署基礎結構。
整合測試會驗證新引進的程式代碼變更不會中斷現有的程序代碼。 在 DevOps 中,持續整合 (CI) 是指每當程式代碼基底變更時建置整個系統的程式,例如想要將 PR 合併到 Git 存放庫的人。 下列清單包含整合測試的常見範例:
- 靜態程式碼分析工具,例如 lint 和格式化工具。
- 執行 terraform validate 來驗證組態檔的語法。
- 執行 terraform 計劃 ,以確保組態如預期般運作。
在本文中,您將瞭解如何:
- 瞭解 Terraform 專案的整合測試基本概念。
- 使用 Azure DevOps 來設定持續整合管線。
- 在 Terraform 程式代碼上執行靜態程式代碼分析。
- 執行
terraform validate,以驗證本機電腦上的 Terraform 組態檔。 - 執行
terraform plan,從遠端服務的觀點驗證 Terraform 組態檔。 - 使用 Azure Pipeline 將持續整合自動化。
1.設定您的環境
- Azure 訂用帳戶:如果您沒有 Azure 訂用帳戶,請在開始之前建立 免費帳戶 。
設定 Terraform:如果您尚未這麼做,請使用下列其中一個選項來設定 Terraform:
Azure DevOps 組織和專案:如果您沒有 Azure DevOps 組織,請建立 Azure DevOps 組織。
Terraform 組建和發行工作延伸模組: 將 Terraform 組建/發行工作延伸模塊安裝 到您的 Azure DevOps 組織中。
授予 Azure DevOps 存取權以連接到您的 Azure 訂用帳戶:建立一個名為 的
terraform-basic-testing-azure-connection,以允許 Azure Pipelines 連接到您的 Azure 訂用帳戶。範例程式代碼和資源: 從 GitHub 下載 整合測試專案。 您下載範例的目錄稱為 範例目錄。
2.驗證本機 Terraform 設定
terraform validate 命令是從包含 Terraform 檔案之目錄中的命令行執行。 此命令的主要目標是驗證語法。
在範例目錄中,流覽至
src目錄。執行 terraform init 來初始化工作目錄。
terraform init執行 terraform validate 來驗證組態檔的語法。
terraform validate要點:
- 您會看到一則訊息,指出 Terraform 配置有效。
編輯
main.tf檔案。在行 5 上,插入使語法失效的錯字。 例如,將
var.location取代為var.loaction儲存檔案。
再次執行驗證。
terraform validate要點:
- 您會看到一個錯誤訊息,指出錯誤的程式碼行和錯誤描述。
如您所見,Terraform 在組態程式代碼的語法中偵測到問題。 此問題阻止組態的部署。
最好先對 Terraform 檔案執行 terraform validate,再將它們推送至您的版本控制系統。 此外,此驗證層級應該是持續整合流程的一部分。 本文稍後將探討如何 設定 Azure 管線來自動驗證。
3. 驗證 Terraform 設定
在上一節中,您已瞭解如何驗證 Terraform 設定。 該測試層級是語法特有的。 該測試並未考慮 Azure 上可能已部署的內容。
Terraform 是一種 宣告式語言,這表示您可以宣告您想要的最終結果。 例如,假設您在資源群組中有10部虛擬機。 然後,您會建立定義三部虛擬機的 Terraform 檔案。 套用此方案並不會將總計數遞增至 13。 相反地,Terraform 會刪除七部虛擬機器,最後剩下三部。 執行 terraform plan 可讓您確認套用執行計劃的潛在結果,以避免意外。
若要產生 Terraform 執行計劃,請執行 terraform 計劃。 此命令會連線到目標 Azure 訂用帳戶,以檢查已部署的組態部分。 然後,Terraform 會決定必要的變更,以符合 Terraform 檔案中所述的需求。 在這個階段,Terraform 不會部署任何專案。 它告訴您,如果您套用方案,會發生什麼事。
如果您遵循本文,且已完成上一節中的步驟,請執行 terraform plan 命令:
terraform plan
執行 terraform plan之後,Terraform 會顯示套用執行計劃的潛在結果。 輸出指出將新增、變更和終結的 Azure 資源。
根據預設,Terraform 會將狀態儲存在與 Terraform 檔案相同的本機目錄中。 此模式適用於單一使用者案例。 不過,當多人在同一個 Azure 資源上工作時,本機狀態檔案可能會不同步。若要解決此問題,Terraform 支援將狀態檔案寫入遠端資料存放區(例如 Azure 記憶體)。 在此案例中,在本機計算機上執行 terraform plan 並以遠端計算機為目標可能會有問題。 因此,在 持續整合管線中自動執行此驗證步驟可能很合理。
4.執行靜態程式代碼分析
靜態程式代碼分析可以直接在 Terraform 設定程式代碼上完成,而不需要執行。 這項分析對於偵測安全性問題和合規性不一致等問題很有用。
下列工具提供 Terraform 檔案的靜態分析:
靜態分析通常在連續整合管線中執行。 這些測試不需要建立執行計劃或部署。 因此,它們的執行速度比其他測試更快,而且通常會在持續整合程式中先執行。
5.使用 Azure Pipeline 自動化整合測試
持續整合牽涉到在引進變更時測試整個系統。 在本節中,您會看到用來實作持續整合的 Azure Pipeline 組態。
使用您選擇的編輯器,瀏覽至 GitHub 上的 Terraform 範例專案的本機複製。
開啟
samples/integration-testing/src/azure-pipeline.yaml檔案。向下捲動至 步驟 區段,其中您會看到一組標準步驟,用來執行各種安裝和驗證例程。
檢查這一行,內容為步驟 1:執行 Checkov 靜態程式代碼分析。 在此步驟中,先前所述的
Checkov專案會在範例 Terraform 組態上執行靜態程式代碼分析。- bash: $(terraformWorkingDirectory)/checkov.sh $(terraformWorkingDirectory) displayName: Checkov Static Code Analysis要點:
- 此腳本負責在 Docker 容器內掛接的 Terraform 工作區中執行 Checkov。 微軟受控代理已啟用 Docker。 在 Docker 容器內執行工具會比較容易,而且不需要在 Azure Pipeline 代理程式上安裝 Checkov。
-
$(terraformWorkingDirectory)變數定義於azure-pipeline.yaml檔案中。
檢閱閱讀的行: 步驟 2:在 Azure Pipelines 代理程式上安裝 Terraform。 您稍早安裝的 Terraform 組建和發行工作延伸模組 有命令,在執行 Azure Pipeline 的代理程式上安裝 Terraform。 此工作是此步驟中正在完成的工作。
- task: charleszipp.azure-pipelines-tasks-terraform.azure-pipelines-tasks-terraform-installer.TerraformInstaller@0 displayName: 'Install Terraform' inputs: terraformVersion: $(terraformVersion)要點:
- 要安裝的 Terraform 版本是透過名為
terraformVersion的 Azure Pipeline 變數指定,並在azure-pipeline.yaml檔案中定義。
- 要安裝的 Terraform 版本是透過名為
請檢查以下內容:步驟 3:運行 Terraform init 以初始化工作區。 在代理程式上安裝 Terraform 之後,就可以初始化 Terraform 目錄。
- task: charleszipp.azure-pipelines-tasks-terraform.azure-pipelines-tasks-terraform-cli.TerraformCLI@0 displayName: 'Run terraform init' inputs: command: init workingDirectory: $(terraformWorkingDirectory)要點:
-
command輸入會指定要執行的 Terraform 命令。 -
workingDirectory輸入表示 Terraform 目錄的路徑。 -
$(terraformWorkingDirectory)變數定義於azure-pipeline.yaml檔案中。
-
檢查內容為: 步驟 4:執行 Terraform validate 以驗證 HCL 語法 的行。 初始化專案目錄之後,就會執行
terraform validate來驗證伺服器上的組態。- task: charleszipp.azure-pipelines-tasks-terraform.azure-pipelines-tasks-terraform-cli.TerraformCLI@0 displayName: 'Run terraform validate' inputs: command: validate workingDirectory: $(terraformWorkingDirectory)檢查該行內容,該行內容是 Step 5: 執行 Terraform plan 以驗證 HCL 語法。 如先前所述,產生執行計劃是為了在部署之前確認 Terraform 組態是否有效。
- task: charleszipp.azure-pipelines-tasks-terraform.azure-pipelines-tasks-terraform-cli.TerraformCLI@0 displayName: 'Run terraform plan' inputs: command: plan workingDirectory: $(terraformWorkingDirectory) environmentServiceName: $(serviceConnection) commandOptions: -var location=$(azureLocation)要點:
- 輸入
environmentServiceName是指在設定 環境中建立的 Azure 服務連線名稱。 這個連線使 Terraform 能夠存取您的 Azure 訂閱。 -
commandOptions輸入可用來將自變數傳遞至 Terraform 命令。 在此情況下,會指定位置。$(azureLocation)變數是在 YAML 檔案中稍早定義的。
- 輸入
將管線匯入 Azure DevOps
開啟您的 Azure DevOps 專案,並移至 [Azure Pipelines] 區段。
選取 [建立管線] 按鈕。
針對 [您的程式代碼在哪裡?] 選項,選取 [GitHub [YAML]。
此時,您可能必須授權 Azure DevOps 存取您的組織。 如需本主題的詳細資訊,請參閱 建置 GitHub 存放庫一文。
在存放庫清單中,選取您在 GitHub 組織中建立之存放庫的分支。
在 [ 設定管線 ] 步驟中,選擇從現有的 YAML 管線開始。
當 [ 選取現有的 YAML 管線 ] 頁面顯示時,指定分支
master並輸入 YAML 管線的路徑:samples/integration-testing/src/azure-pipeline.yaml。
選取 [繼續] 以從 GitHub 載入 Azure YAML 管線。
當 [檢閱管線 YAML] 頁面顯示時,請選取 [執行] 以第一次建立並手動觸發管線。
確認結果
您可以從 Azure DevOps UI 手動執行管線。 不過,本文的要點是顯示自動化持續整合。 將變更提交至您分支的 samples/integration-testing/src 資料夾,以測試流程。 變更會自動在您推送程式碼的分支上觸發新的管線。
完成此步驟之後,請存取 Azure DevOps 中的詳細數據,以確保所有專案都正確執行。
針對 Azure 上的 Terraform 進行疑難解答
針對在 Azure 上使用 Terraform 時的常見問題進行疑難解答