Terraform
存储远程状态
现在你已经构建、修改和销毁了本地机器上的基础设施。这对于测试和开发来说很棒,但在生产环境中,你应该将你的状态安全加密地保存,以便你的团队成员可以访问它以协作进行基础设施管理。实现此目的的最佳方法是在具有共享状态访问权限的远程环境中运行 Terraform。
HCP Terraform 允许团队轻松地对基础设施变更进行版本控制、审计和协作。它还可以将访问凭据从开发人员机器上存储起来,并为长时间运行的 Terraform 进程提供一个安全稳定的环境。
在本教程中,你将把你的状态迁移到 HCP Terraform。
先决条件
本教程假定你已完成之前的教程。如果未完成,请创建一个名为 learn-terraform-azure-instance 的目录,并将此代码粘贴到名为 main.tf 的文件中。
main.tf
terraform {
required_version = ">= 1.1.0"
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "~> 3.0.2"
}
}
}
provider "azurerm" {
features {}
}
resource "azurerm_resource_group" "rg" {
name = "myTFResourceGroup"
location = "westus2"
}
设置 HCP Terraform
如果您拥有 HashiCorp Cloud Platform 或 HCP Terraform 帐户,请使用您的现有凭据登录。 有关如何注册新帐户和创建组织的更详细说明,请参阅 注册 HCP Terraform 教程。
接下来,使用组织名称和您选择的新工作区名称配置您的配置中的 cloud 块
main.tf
terraform {
required_version = ">= 1.1.0"
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "~> 3.0.2"
}
}
cloud {
organization = "<ORG_NAME>"
workspaces {
name = "learn-terraform-azure"
}
}
}
provider "azurerm" {
features {}
}
使用 HCP Terraform 进行身份验证
现在您已经定义了您的 HCP Terraform 配置,您必须使用 HCP Terraform 进行身份验证才能继续初始化。 为了使用 HCP Terraform 进行身份验证,请运行 terraform login 子命令,并按照提示登录。
$ terraform login
Terraform will request an API token for app.terraform.io using your browser.
If login is successful, Terraform will store the token in plain text in
the following file for use by subsequent commands:
/Users/username/.terraform.d/credentials.tfrc.json
Do you want to proceed? (y/n)
有关登录的更详细说明,请参阅 登录教程。
迁移状态文件
现在可以迁移你的本地状态文件到 HCP Terraform 了。重新初始化你的配置以开始迁移。这将导致 Terraform 识别你的 cloud 块配置。
$ terraform init
Initializing HCP Terraform...
Do you wish to proceed?
As part of migrating to HCP Terraform, Terraform can optionally copy your
current workspace state to the configured HCP Terraform workspace.
Answer "yes" to copy the latest state snapshot to the configured
HCP Terraform workspace.
Answer "no" to ignore the existing state and just activate the configured
HCP Terraform workspace with its existing state, if any.
Should Terraform migrate your existing state?
Enter a value:
在重新初始化期间,Terraform 会提示你,它会将状态文件复制到你的 HCP Terraform 工作区。输入 yes,以便 Terraform 将状态从你的本地机器迁移到 HCP Terraform。
Enter a value: yes
Initializing provider plugins...
- Using previously-installed hashicorp/azurerm v3.0.2
HCP Terraform has been successfully initialized!
You may now begin working with HCP Terraform. Try running "terraform plan" to
see any changes that are required for your infrastructure.
If you ever set or change modules or Terraform Settings, run "terraform init"
again to reinitialize your working directory.
在使用 HCP Terraform 和 CLI 驱动的工作流程时,你可以选择让 Terraform 远程运行,或在你的本地机器上运行。默认选项是远程执行——HCP Terraform 将远程执行 Terraform 操作。当使用本地执行时,HCP Terraform 将在你的本地机器上执行 Terraform,并将你的状态文件远程存储在 HCP Terraform 中。对于本教程,你将使用工作区的默认远程执行选项。
现在 Terraform 已经将状态文件迁移到 HCP Terraform,删除本地状态文件。
$ rm terraform.tfstate
配置服务主体
如果你尚未登录到 Azure,请使用 Azure CLI 登录到你的帐户。
$ az login
你的浏览器窗口将打开,你将收到提示以输入你的 Azure 登录凭据。成功身份验证后,你的终端将显示你的订阅信息。你不需要保存此输出,因为它已保存到你的系统中供 Terraform 使用。
服务主体是 Azure Active Directory 中的一个应用程序,其身份验证令牌可以用作 HCP Terraform 中的环境变量。有关更多信息,请访问 Azure 文档。
首先,列出与你的 Azure 帐户关联的订阅。
$ az account list
[
{
"cloudName": "AzureCloud",
"id": "00000000-0000-0000-0000-000000000000",
"isDefault": true,
"name": "PAYG Subscription",
"state": "Enabled",
"tenantId": "00000000-0000-0000-0000-000000000000",
"user": {
"name": "user@example.com",
"type": "user"
}
}
]
选择一个订阅并复制其 id 字段值。这是与你的帐户关联的订阅 ID。将此值粘贴到下面的命令中,并使用你自己的订阅 ID 保存该值。你稍后会使用它来授予 HCP Terraform 访问你的 Azure 帐户的权限。
$ az account set --subscription="SUBSCRIPTION_ID"
使用相同的订阅 ID 创建服务主体。
$ az ad sp create-for-rbac --role="Contributor" --scopes="/subscriptions/SUBSCRIPTION_ID"
Creating a role assignment under the scope of "/subscriptions/SUBSCRIPTION_ID"
{
"appId": "00000000-0000-0000-0000-000000000000",
"displayName": "azure-cli-2017-06-05-10-41-15",
"name": "http://azure-cli-2017-06-05-10-41-15",
"password": "0000-0000-0000-0000-000000000000",
"tenant": "00000000-0000-0000-0000-000000000000"
}
将此输出复制到安全的地方。
更新 HCP Terraform 环境变量
现在你已经拥有了帐户的身份验证信息,请导航到 HCP Terraform UI 中的 learn-terraform-azure 工作区。
找到“变量”选项卡,并使用你输入和获取的命令中的值创建以下环境变量。将 ARM_CLIENT_SECRET 设置为敏感值。
| 环境变量 | AZ CLI |
|---|---|
ARM_SUBSCRIPTION_ID | SUBSCRIPTION_ID 来自上一个命令的输入。 |
ARM_CLIENT_ID | appID 来自上一个命令的输出。 |
ARM_CLIENT_SECRET | password 来自上一个命令的输出。(敏感) |
ARM_TENANT_ID | tenant 来自上一个命令的输出。 |
更新并保存这四个环境变量。将 ARM_CLIENT_SECRET 设置为敏感值。查看你的环境变量,以确保它们与以下示例匹配。

应用配置
现在,应用你的配置,包括所需的变量。Terraform 会告诉你没有任何更改。
$ terraform apply
## ...
No changes. Infrastructure is up-to-date.
This means that Terraform did not detect any differences between your
configuration and real physical resources that exist. As a result, Terraform
doesn't need to do anything.
Terraform 现在将你的状态远程存储在 HCP Terraform 中。远程状态存储使得协作更加容易,并将状态和敏感信息从你的本地磁盘中移除。远程状态仅在被使用时才加载到内存中。
销毁基础设施
销毁你的基础设施,并记得用 yes 确认。
$ terraform destroy
下一步
这完成了 Terraform 的入门教程。现在你可以使用 Terraform 来创建和管理你的基础设施。
为了获得更多关于 Terraform 配置文件语言、资源配置或导入现有基础设施的实践经验,请查看以下教程。
配置语言 - 进一步熟悉变量、输出、依赖项、元参数和其他语言特性,以编写更复杂的 Terraform 配置。
模块 - 使用模块组织和重用 Terraform 配置。
导入 - 将现有基础设施导入 Terraform。
要了解更多可用的配置选项,请参阅 Terraform 文档。
了解更多关于 HCP Terraform 的信息
HCP Terraform 支持两种主要的执行 Terraform 运行的流程
- 基于 VCS 的工作流程,每当配置的 VCS 仓库提交更改时,它会自动排队计划。
- 基于 API 的工作流程,CI 管道或其他自动化工具可以直接上传配置。
要了解 HCP Terraform 基于 VCS 的工作流程的实践介绍,请遵循 HCP Terraform 入门教程。HCP Terraform 还提供 商业解决方案,其中包括团队权限管理、策略实施、代理等。