使用 Terraform 可以定义、预览和部署云基础结构。 使用 Terraform 时,请使用 HCL 语法来创建配置文件。 利用 HCL 语法,可指定 Azure 这样的云提供程序和构成云基础结构的元素。 创建配置文件后,请创建一个执行计划,利用该计划,可在部署基础结构更改之前先预览这些更改。 验证了更改后,请应用该执行计划以部署基础结构。
本文介绍如何使用 AzAPI Terraform 提供程序 来管理 AzureRM 提供程序 当前不支持的 Azure 服务。 在示例代码中,azapi_resource
用于管理 Azure 容器注册表 资源。
- 定义和配置 AzureRM 和 AzAPI 提供程序
- 使用 AzureRM 提供程序创建具有唯一名称的 Azure 资源组
- 使用 AzureRM 提供程序在你的订阅中注册“Microsoft.ContainerRegistry”提供程序。
- 使用 AzAPI 提供程序创建 Azure 容器注册表资源
先决条件
- Azure 订阅:如果没有 Azure 订阅,请在开始之前创建一个免费帐户。
配置 Terraform:如果尚未执行此操作,请使用以下选项之一配置 Terraform:
实现 Terraform 代码
注意
本文的示例代码位于 Azure Terraform GitHub 存储库。 可以查看包含当前版本和早期版本的 Terraform 的测试结果的日志文件。
创建用于测试和运行示例 Terraform 代码的目录,并将其设为当前目录。
创建名为
providers.tf
的文件并插入下列代码:terraform { required_providers { azapi = { source = "Azure/azapi" version = "~>2.0" } azurerm = { source = "hashicorp/azurerm" version = "~>4.0" } random = { source = "hashicorp/random" version = "~>3.0" } } } provider "azurerm" { features {} }
创建名为
variables.tf
的文件并插入下列代码:variable "resource_group_location" { type = string default = "eastus" description = "Location of the resource group." } variable "resource_group_name_prefix" { type = string default = "rg" description = "Prefix of the resource group name that's combined with a random ID so name is unique in your Azure subscription." } variable "container_registry_name" { type = string default = "" description = "Name of the container registry." }
创建名为
main.tf
的文件并插入下列代码:# Create a resource group with a random name. resource "random_pet" "rg_name" { prefix = var.resource_group_name_prefix } resource "azurerm_resource_group" "rg" { ___location = var.resource_group_location name = random_pet.rg_name.id } # Create a user assigned identity resource. resource "azurerm_user_assigned_identity" "example" { name = "example" resource_group_name = azurerm_resource_group.rg.name ___location = azurerm_resource_group.rg.___location } # Create a random name for the container registry. resource "random_string" "acr_name" { length = 10 special = false upper = false numeric = false } # Manage a container registry resource. resource "azapi_resource" "example" { type = "Microsoft.ContainerRegistry/registries@2020-11-01-preview" name = coalesce(var.container_registry_name, random_string.acr_name.result) parent_id = azurerm_resource_group.rg.id ___location = azurerm_resource_group.rg.___location identity { type = "SystemAssigned, UserAssigned" identity_ids = [azurerm_user_assigned_identity.example.id] } body = { sku = { name = "Standard" } properties = { adminUserEnabled = true } } tags = { "Key" = "Value" } response_export_values = ["properties.loginServer", "properties.policies.quarantinePolicy.status"] }
创建名为
outputs.tf
的文件并插入下列代码:output "resource_group_name" { value = azurerm_resource_group.rg.name } output "azure_container_registry_name" { value = azapi_resource.example.name }
初始化 Terraform
运行 terraform init,将 Terraform 部署进行初始化。 此命令将下载管理 Azure 资源所需的 Azure 提供程序。
terraform init -upgrade
要点:
- 参数
-upgrade
可将必要的提供程序插件升级到符合配置版本约束的最新版本。
创建 Terraform 执行计划
运行 terraform plan 以创建执行计划。
terraform plan -out main.tfplan
要点:
terraform plan
命令将创建一个执行计划,但不会执行它。 它会确定创建配置文件中指定的配置需要执行哪些操作。 此模式允许你在对实际资源进行任何更改之前验证执行计划是否符合预期。- 使用可选
-out
参数可以为计划指定输出文件。 使用-out
参数可以确保所查看的计划与所应用的计划完全一致。
应用 Terraform 执行计划
运行 terraform apply,将执行计划应用到云基础结构。
terraform apply main.tfplan
要点:
- 示例
terraform apply
命令假设你先前运行了terraform plan -out main.tfplan
。 - 如果为
-out
参数指定了不同的文件名,请在对terraform apply
的调用中使用该相同文件名。 - 如果未使用
-out
参数,请调用不带任何参数的terraform apply
。
验证结果
获取资源组名称。
resource_group_name=$(terraform output -raw resource_group_name)
获取容器注册表名称。
azure_container_registry_name=$(terraform output -raw azure_container_registry_name)
运行 az acr show 以查看容器注册表。
az acr show --name $azure_container_registry_name --resource-group $resource_group_name
清理资源
不再需要通过 Terraform 创建的资源时,请执行以下步骤:
运行 terraform plan 并指定
destroy
标志。terraform plan -destroy -out main.destroy.tfplan
要点:
terraform plan
命令将创建一个执行计划,但不会执行它。 它会确定创建配置文件中指定的配置需要执行哪些操作。 此模式允许你在对实际资源进行任何更改之前验证执行计划是否符合预期。- 使用可选
-out
参数可以为计划指定输出文件。 使用-out
参数可以确保所查看的计划与所应用的计划完全一致。
运行 terraform apply 以应用执行计划。
terraform apply main.destroy.tfplan
Azure 上的 Terraform 故障排除
排查在 Azure 上使用 Terraform 时遇到的常见问题