使用 Bash 在 Azure Cloud Shell 中配置 Terraform

使用 Terraform 可以定义、预览和部署云基础结构。 使用 Terraform 时,请使用 HCL 语法来创建配置文件。 利用 HCL 语法,可指定 Azure 这样的云提供程序和构成云基础结构的元素。 创建配置文件后,请创建一个执行计划,利用该计划,可在部署基础结构更改之前先预览这些更改。 验证了更改后,请应用该执行计划以部署基础结构。

本文提供向 Azure 进行身份验证以用于 Terraform 的选项。

在本文中,学习如何:

  • 配置 Cloud Shell
  • 显示当前 Azure 帐户
  • 了解常见 Terraform 和 Azure 身份验证方案
  • 从 Cloud Shell 通过 Microsoft 帐户进行身份验证(使用 Bash 或 PowerShell)
  • 从 Windows 通过 Microsoft 帐户进行身份验证(使用 Bash 或 PowerShell)
  • 使用 Azure CLI 创建服务主体
  • 使用 Azure PowerShell 创建服务主体
  • 在环境变量中指定服务主体凭据
  • 在 Terraform 提供程序块中指定服务主体凭据

1.配置环境

  • Azure 订阅:如果没有 Azure 订阅,请在开始之前创建一个免费帐户。

2. 打开 Cloud Shell

  1. 如果已打开了 Cloud Shell 会话,可以跳转到下一部分。

  2. 浏览到 Azure 门户

  3. 如有必要,请登录 Azure 订阅并更改 Azure 目录。

  4. 打开 Cloud Shell。

    Open Cloud Shell from the top menu in the Azure portal.

  5. 如果以前未使用过 Cloud Shell,请配置环境和存储设置。

  6. 选择命令行环境。

    Select the CLI you want to use in Cloud Shell.

3. 在 Azure Cloud Shell 中安装最新版本的 Terraform

Cloud Shell 自动更新到最新版本的 Terraform。 但是,这些更新在发布后的几周内提供。 本文介绍如何下载并安装当前版本的 Terraform。

  1. 确定在 Cloud Shell 中所使用的 Terraform 版本。

    terraform version
    
  2. 如果安装在 Cloud Shell 中的 Terraform 版本不是最新版本,则会看到一条消息,指示 Terraform 的版本已过时。

  3. 如果能够正常使用指示的版本,请跳到下一部分。 否则,请继续执行以下步骤。

  4. 浏览到 Terraform 下载页

  5. 向下滚动到“Linux”下载链接

  6. 将鼠标移动到“64 位”链接上方。 此链接适用于适用于 Cloud Shell 的最新 64 位 Linux AMD 版本。

  7. 复制 URL。

  8. 运行 curl,将占位符替换为在上一步骤中复制的 URL。

    curl -O <terraform_download_url>
    
  9. 解压缩文件。

    unzip <zip_file_downloaded_in_previous_step>
    
  10. 如果目录不存在,请创建名为 bin 的目录。

    mkdir bin
    
  11. terraform 文件移动到 bin 目录中。

    mv terraform bin/    
    
  12. 关闭并重启 Cloud Shell。

  13. 验证下载的 Terraform 版本是否为路径中的第一个。

    terraform version
    

4. 验证默认 Azure 订阅

使用 Microsoft 帐户登录 Azure 门户时,会使用该帐户的默认 Azure 订阅。

Terraform 会使用默认 Azure 订阅中的信息自动进行身份验证。

运行 az account show 以验证当前 Microsoft 帐户和 Azure 订阅。

az account show

通过 Terraform 所做的任何更改都显示在显示的 Azure 订阅上。 如果这是所需内容,请跳过本文的其余部分。

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 订阅名称和 ID,请运行 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> 占位符替换为要使用的订阅的 ID 或名称。
    • 调用 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 时遇到的常见问题

后续步骤