在 Azure 中實作 Terraform 專案的整合測試
Terraform 可讓您定義、預覽和部署雲端基礎結構。 使用 Terraform 時,您可以使用 HCL 語法來建立設定檔。 HCL 語法可讓您指定雲端提供者 (例如 Azure) 和構成雲端基礎結構的元素。 建立設定檔之後,您可以建立執行計畫,讓您先預覽基礎結構變更,之後再部署。 驗證變更之後,您可以套用執行計畫來部署基礎結構。
整合測試會驗證新引進的程式代碼變更不會中斷現有的程序代碼。 在 DevOps 中,持續整合 (CI) 是指每當程式代碼基底變更時建置整個系統的程式,例如想要將 PR 合併到 Git 存放庫的人。 下列清單包含整合測試的常見範例:
- 靜態程式代碼分析工具,例如lint和 format。
- 執行 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 訂用帳戶的 Azure DevOps 存取權:建立名為 的
terraform-basic-testing-azure-connection
Azure 服務連線,以允許 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。 Microsoft 管理的代理程序已啟用 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 驗證來驗證 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)
檢閱閱讀的行: 步驟 5:執行 Terraform 計劃來驗證 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 時的常見問題進行疑難排解