使用Bash在 Windows 上安裝 Terraform

Terraform 可讓您定義、預覽和部署雲端基礎結構。 使用 Terraform 時,您可以使用 HCL 語法來建立設定檔。 HCL 語法可讓您指定雲端提供者 (例如 Azure) 和構成雲端基礎結構的元素。 建立設定檔之後,您可以建立執行計畫,讓您先預覽基礎結構變更,之後再部署。 驗證變更之後,您可以套用執行計畫來部署基礎結構。

本文會提供向 Azure 驗證以搭配 Terraform 使用的選項。

在本文中,您將學會如何:

  • 安裝 Git Bash 終端機模擬器
  • 安裝 Azure CLI
  • 安裝 Terraform (英文)
  • 設定您的環境以在 Windows 上執行 Terraform
  • 了解常見的 Terraform 和 Azure 驗證案例
  • 從 Cloud Shell 透過 Microsoft 帳戶進行驗證 (使用 Bash 或 PowerShell)
  • 從 Windows 透過 Microsoft 帳戶進行驗證 (使用 Bash 或 PowerShell)
  • 使用 Azure CLI 建立服務主體
  • 使用 Azure PowerShell 建立服務主體
  • 在環境變數中指定服務主體認證
  • 在 Terraform 提供者區塊中指定服務主體認證

1.設定您的環境

  • Azure 訂用帳戶:如果您沒有 Azure 訂用帳戶,請在開始前建立免費帳戶

2.安裝終端機模擬器

Windows 上有許多選項可執行bash命令,包括 Git Bash 和 Windows 終端機。 本文已使用 Git Bash 進行測試。 下載並安裝 Git Bash

3.安裝 Azure CLI

安裝 Azure CLI。 本文已使用 Azure CLI 2.26.1 版進行測試。

4.安裝適用於 Windows 的 Terraform

  1. 下載 Terraform。 本文已使用 Terraform 1.1.4 版進行測試。

  2. 從下載中,將可執行檔案解壓縮到您選擇的目錄(例如 , c:\terraform

  3. 更新系統的全域PATH環境變數,以包含包含可執行文件的目錄。

  4. 開啟終端機視窗。

  5. 使用 命令確認全域路徑組 terraform 態。

    terraform -version
    

5.向 Azure 驗證 Terraform

Terraform 和 Azure 驗證情節

Terraform 只能支援透過 Azure CLI 向 Azure 進行驗證。 不支援使用 Azure PowerShell 進行驗證。 因此,雖然您可以在執行 Terraform 工作時使用 Azure PowerShell 模組,但您必須先使用 Azure CLI 向 Azure 進行驗證。

本文說明如何針對下列情節向 Azure 驗證 Terraform。 如需向 Azure 驗證 Terraform 的選項詳細資訊,請參閱使用 Azure CLI 進行驗證

透過 Microsoft 帳戶向 Azure 進行驗證

Microsoft 帳戶是用來登入 Microsoft 服務的使用者名稱 (與電子郵件及其認證相關聯),例如 Azure。 Microsoft 帳戶可以與一或多個 Azure 訂用帳戶相關聯,其中一個訂用帳戶是預設值。

下列步驟將示範如何:

  • 使用 Microsoft 帳戶以互動方式登入 Azure
  • 列出帳戶的相關聯 Azure 訂用帳戶 (包括預設值)
  • 設定目前的訂用帳戶
  1. 開啟可存取 Azure CLI 的命令行。

  2. 執行 az login 時不需任何參數,請依照指示登入 Azure。

    az login
    

    重點︰

    • 成功登入時,az login 顯示已登入 Microsoft 帳戶相關聯的 Azure 訂用帳戶清單,包括預設訂用帳戶。
  3. 若要確認目前的 Azure 訂用帳戶,請執行 az account show

    az account show
    
  4. 若要檢視特定 Microsoft 帳戶的所有 Azure 訂用帳戶名稱和識別碼,請執行 az account list

    az account list --query "[?user.name=='<microsoft_account_email>'].{Name:name, ID:id, Default:isDefault}" --output Table
    

    重點︰

    • <microsoft_account_email> 預留位置取代為您想要列出其 Azure 訂用帳戶的 Microsoft 帳戶電子郵件地址。
    • 使用 Live 帳戶,例如 Hotmail 或 Outlook,您可能需要指定完整的電子郵件地址。 例如,如果您的電子郵件地址是 admin@hotmail.com,您可能需要將預留位置取代為 live.com#admin@hotmail.com
  5. 若要使用特定的 Azure 訂用帳戶,請執行 az account set

    az account set --subscription "<subscription_id_or_subscription_name>"
    

    重點︰

    • 以您想要使用訂用帳戶的識別碼或名稱取代 <subscription_id_or_subscription_name> 預留位置。
    • 呼叫 az account set 不會顯示切換至指定 Azure 訂用帳戶的結果。 不過,您可以使用 az account show 來確認目前的 Azure 訂用帳戶是否已變更。
    • 如果您從上一個步驟執行 az account list 命令,您會看到預設 Azure 訂用帳戶已變更為您使用 az account set 指定的訂用帳戶。

建立服務主體

部署或使用 Azure 服務的自動化工具 (例如 Terraform),應一律具有受限制的權限。 有別於以完整權限使用者身分登入應用程式的作法,Azure 提供服務主體。

最常見的模式是以互動方式登入 Azure、建立服務主體、測試服務主體,然後使用該服務主體進行未來的驗證 (以互動方式或從您的指令碼)。

  1. 若要建立服務主體,請登入 Azure。 透過 Microsoft 帳戶向 Azure 進行驗證之後,請返回這裡。

  2. 如果您要從 Git Bash 建立服務主體,請設定 MSYS_NO_PATHCONV 環境變數。 (如果您使用 Cloud Shell,則不需要此步驟)。

    export MSYS_NO_PATHCONV=1    
    

    重點︰

    • 您可以全域方式設定 MSYS_NO_PATHCONV 環境變數 (針對所有終端工作階段) 或本機 (僅適用於目前的工作階段)。 由於建立服務主體並非您經常執行的動作,此範例會設定目前工作階段的值。 若要全域設定此環境變數,請將設定新增至 ~/.bashrc 檔案。
  3. 若要建立服務主體,請執行 az ad sp create-for-rbac

    az ad sp create-for-rbac --name <service_principal_name> --role Contributor --scopes /subscriptions/<subscription_id>
    

    重點︰

    • 您可以將 <service-principal-name> 取代為環境的自訂名稱,或完全省略 參數。 如果您省略參數,則會根據目前的日期和時間產生服務主體名稱。
    • 成功完成時,az ad sp create-for-rbac 會顯示數個值。 下一個步驟會使用 appIdpasswordtenant 值。
    • 如果遺失,就無法擷取密碼。 因此,您應該將密碼儲存在安全的地方。 如果您忘記密碼,您可以重設服務主體認證
    • 本文中正在使用具有參與者角色的服務主體。 如需角色型存取控制 (RBAC) 角色的詳細資訊,請參閱 RBAC:內建角色
    • 建立服務主體的輸出包含敏感性認證。 請務必不要在程式碼中包含這些認證,或是將認證簽入原始檔控制中。
    • 如需使用 Azure CLI 建立服務主體時選項的詳細資訊,請參閱使用 Azure CLI 建立 Azure 服務主體一文。

在環境變數中指定服務主體認證

建立服務主體之後,您可以透過環境變數將其認證指定給 Terraform。

  1. 新增下列環境變數,以編輯 ~/.bashrc 檔案。

    export ARM_SUBSCRIPTION_ID="<azure_subscription_id>"
    export ARM_TENANT_ID="<azure_subscription_tenant_id>"
    export ARM_CLIENT_ID="<service_principal_appid>"
    export ARM_CLIENT_SECRET="<service_principal_password>"
    
  2. 若要執行 ~/.bashrc 腳本,請執行 source ~/.bashrc (或其縮寫的對等用法 . ~/.bashrc)。 您也可以結束並重新開啟 Cloud Shell,讓指令碼自動執行。

    . ~/.bashrc
    
  3. 設定環境變數之後,您可以確認其值,如下所示:

    printenv | grep ^ARM*
    

重點︰

  • 如同任何環境變數,若要從 Terraform 指令碼中存取 Azure 訂用帳戶值,請使用下列語法:${env.<environment_variable>}。 例如,若要存取 ARM_SUBSCRIPTION_ID 值,請指定 ${env.ARM_SUBSCRIPTION_ID}
  • 建立及套用 Terraform 執行計畫,會在服務主體相關聯的 Azure 訂用帳戶上進行變更。 如果您已登入一個 Azure 訂用帳戶,而環境變數指向第二個 Azure 訂用帳戶,實際上有時可能會造成混淆。 讓我們看下列範例以利說明。 假設您有兩個 Azure 訂用帳戶:SubA 和 SubB。 如果目前的 Azure 訂用帳戶是 SubA (透過 az account show 決定),而環境變數指向 SubB,則 Terraform 所做的任何變更都在 SubB 上。 因此,您必須登入您的 SubB 訂用帳戶,以執行 Azure CLI 命令或 Azure PowerShell 命令來檢視您的變更。

在 Terraform 提供者區塊中指定服務主體認證

Azure 提供者區塊會定義可讓您指定 Azure 訂用帳戶驗證資訊的語法。

terraform {
  required_providers {
    azurerm = {
      source = "hashicorp/azurerm"
      version = "~>2.0"
    }
  }
}

provider "azurerm" {
  features {}

  subscription_id   = "<azure_subscription_id>"
  tenant_id         = "<azure_subscription_tenant_id>"
  client_id         = "<service_principal_appid>"
  client_secret     = "<service_principal_password>"
}

# Your code goes here

警告

在 Terraform 設定檔中指定 Azure 訂用帳戶認證的能力可能很方便,尤其是在測試時。 不過,不建議將認證儲存在可由非信任人員檢視的純文字檔中。

對 Azure 上的 Terraform 進行疑難排解

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

下一步