使用 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
如果已打开了 Cloud Shell 会话,可以跳转到下一部分。
浏览到 Azure 门户
如有必要,请登录 Azure 订阅并更改 Azure 目录。
打开 Cloud Shell。
如果以前未使用过 Cloud Shell,请配置环境和存储设置。
选择命令行环境。
3. 在 Azure Cloud Shell 中安装最新版本的 Terraform
Cloud Shell 自动更新到最新版本的 Terraform。 但是,这些更新在发布后的几周内提供。 本文介绍如何下载并安装当前版本的 Terraform。
确定在 Cloud Shell 中所使用的 Terraform 版本。
terraform version
如果安装在 Cloud Shell 中的 Terraform 版本不是最新版本,则会看到一条消息,指示 Terraform 的版本已过时。
如果能够正常使用指示的版本,请跳到下一部分。 否则,请继续执行以下步骤。
浏览到 Terraform 下载页。
向下滚动到“Linux”下载链接。
将鼠标移动到“64 位”链接上方。 此链接适用于适用于 Cloud Shell 的最新 64 位 Linux AMD 版本。
复制 URL。
运行
curl
,将占位符替换为在上一步骤中复制的 URL。curl -O <terraform_download_url>
解压缩文件。
unzip <zip_file_downloaded_in_previous_step>
如果目录不存在,请创建名为
bin
的目录。mkdir bin
将
terraform
文件移动到bin
目录中。mv terraform bin/
关闭并重启 Cloud Shell。
验证下载的 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 进行身份验证。
- 使用 Cloud Shell(借助 Bash 或 PowerShell)通过 Microsoft 帐户进行身份验证
- 使用 Windows(借助 Bash 或 PowerShell)通过 Microsoft 帐户进行身份验证
- 通过服务主体进行身份验证:
通过 Microsoft 帐户向 Azure 进行身份验证
Microsoft 帐户是用于登录 Microsoft 服务(如 Azure)的用户名(与电子邮件及其凭据关联)。 Microsoft 帐户可以与一个或多个 Azure 订阅关联,其中一个订阅是默认订阅。
以下步骤演示了操作方法:
- 使用 Microsoft 帐户以交互方式登录到 Azure
- 列出帐户的关联 Azure 订阅(包括默认)
- 设置当前订阅。
打开有权访问 Azure CLI 的命令行。
运行不带任何参数的 az login,并按照说明登录 Azure。
az login
要点:
- 成功登录后,
az login
会显示与已登录 Microsoft 帐户相关联的 Azure 订阅的列表(包括默认订阅)。
- 成功登录后,
若要查看当前 Azure 订阅,请运行 az account show。
az account show
若要查看特定 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
。
- 将
若要使用特定 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,创建服务主体,测试服务主体,然后将该服务主体用于将来的身份验证(以交互方式或通过脚本)。
若要创建服务主体,请登录到 Azure。 通过 Microsoft 帐户向 Azure 进行身份验证之后,请返回此处。
如果通过 Git Bash 创建服务主体,请设置
MSYS_NO_PATHCONV
环境变量。 (如果使用的是 Cloud Shell,则此步骤不是必需的。)export MSYS_NO_PATHCONV=1
要点:
- 可以在全局(为所有终端会话)或本地(只为当前会话)设置
MSYS_NO_PATHCONV
环境变量。 由于创建服务主体不是经常执行的操作,因此示例会为当前会话设置值。 若要在全局设置此环境变量,请将设置添加到~/.bashrc
文件。
- 可以在全局(为所有终端会话)或本地(只为当前会话)设置
若要创建服务主体,请使用 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
会显示多个值。 下一步中将使用appId
、password
和tenant
值。 - 如果丢失了密码,则无法对其进行检索。 因此,应将密码存储在安全的位置。 如果忘记了密码,则可以重置服务主体凭据。
- 对于本文,会使用一个具有“参与者”角色的服务主体。 有关基于角色的访问控制 (RBAC) 角色的详细信息,请参阅 RBAC:内置角色。
- 创建服务主体的输出包含敏感凭据。 请确保没有将这些凭据包含在代码中,也没有将凭据签入到源代码管理中。
- 有关使用 Azure CLI 创建服务主体时的选项的详细信息,请参阅使用 Azure CLI 创建 Azure 服务主体一文。
- 可以将
在环境变量中指定服务主体凭据
创建服务主体后,可以通过环境变量将其凭据指定给 Terraform。
通过添加以下环境变量来编辑
~/.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>"
若要执行
~/.bashrc
脚本,请运行source ~/.bashrc
(或其缩写等效项. ~/.bashrc
)。 还可以退出并重新打开 Cloud Shell 以便自动运行脚本。. ~/.bashrc
设置环境变量后,可以验证其值,如下所示:
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 时遇到的常见问题
后续步骤
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈