共用方式為


在 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 訂用帳戶,請在開始前建立免費帳戶

2.驗證本機 Terraform 設定

terraform validate 命令是從包含 Terraform 檔案之目錄中的命令行執行。 此命令的主要目標是驗證語法。

  1. 在範例目錄中,流覽至 src 目錄。

  2. 執行 terraform init 來初始化工作目錄。

    terraform init
    
  3. 執行 terraform validate 來驗證組態檔的語法。

    terraform validate
    

    重點︰

    • 您會看到訊息,指出 Terraform 組態有效。
  4. 編輯 main.tf 檔案。

  5. 在行 5 上,插入使語法失效的錯字。 例如,將 取代 var.locationvar.loaction

  6. 儲存檔案。

  7. 再次執行驗證。

    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 組態。

  1. 使用您選擇的編輯器,流覽至 GitHub 上 Terraform 範例專案的本機複製

  2. 開啟 samples/integration-testing/src/azure-pipeline.yaml 檔案。

  3. 向下捲動至 步驟 區段,其中您會看到一組標準步驟,用來執行各種安裝和驗證例程。

  4. 檢閱閱讀的行: 步驟 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
  5. 檢閱閱讀的行: 步驟 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 並在檔案中定義。
  6. 檢閱讀取的行: 步驟 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
  7. 檢閱讀取的行: 步驟 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)
    
  8. 檢閱閱讀的行: 步驟 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

  1. 開啟您的 Azure DevOps 專案,並移至 [Azure Pipelines] 區段。

  2. 選取 [ 建立管線] 按鈕。

  3. 針對 [您的程式代碼在哪裡?] 選項,選取 [GitHub [YAML]。

    您的程式碼在哪裡?

  4. 此時,您可能必須授權 Azure DevOps 存取您的組織。 如需本主題的詳細資訊,請參閱建置 GitHub 存放庫一文

  5. 在存放庫清單中,選取您在 GitHub 組織中建立之存放庫的分支。

  6. 在 [ 設定管線 ] 步驟中,選擇從現有的 YAML 管線開始。

    現有的 YAML 管線

  7. 當 [ 選取現有的 YAML 管線 ] 頁面顯示時,指定分支 master 並輸入 YAML 管線的路徑: samples/integration-testing/src/azure-pipeline.yaml

    選取現有的 YAML 管線

  8. 選取 [ 繼續] 以從 GitHub 載入 Azure YAML 管線。

  9. 當 [ 檢閱您的管線 YAML ] 頁面顯示時,選取 [ 執行 ] 以第一次建立並手動觸發管線。

    執行 Azure Pipeline

驗證結果

您可以從 Azure DevOps UI 手動執行管線。 不過,本文的要點是顯示自動化持續整合。 將變更認可至 samples/integration-testing/src 分支存放庫的資料夾,以測試程式。 變更會自動在您要推送程式代碼的分支上觸發新的管線。

從 GitHub 執行的管線

完成此步驟之後,請存取 Azure DevOps 中的詳細數據,以確保所有專案都正確執行。

Azure DevOps 綠色管線

對 Azure 上的 Terraform 進行疑難排解

針對在 Azure 上使用 Terraform 時的常見問題進行疑難排解

下一步