在本快速入门中,你将使用 Terraform 创建 Azure Batch 帐户、Azure 存储帐户和两个 Batch 池。 Batch 是一种基于云的作业计划服务,它可以将大量数据的处理并行化并分配到多台计算机上。 它通常用于呈现 3D 图形、分析大型数据集或处理视频等任务。 在这种情况下,创建的资源包括 Batch 帐户(这是用于分布式处理任务的中央组织实体)、用于保存要处理数据的存储帐户,以及两个 Batch 池,这些池是执行任务的虚拟机组。
使用 Terraform 可以定义、预览和部署云基础结构。 使用 Terraform 时,请使用 HCL 语法来创建配置文件。 HCL 语法允许你指定云提供商(如 Azure)和构成云基础结构的元素。 创建配置文件后,可以创建 一个执行计划 ,以便在部署基础结构更改之前预览这些更改。 验证更改后,应用执行计划来部署基础结构。
- 指定所需的 Terraform 版本和所需的提供程序。
- 定义不含附加功能的 Azure 服务提供商。
- 为资源组位置和名称前缀定义变量。
- 为 Azure 资源组生成随机名称。
- 在指定位置创建具有生成名称的资源组。
- 为存储帐户名称生成随机字符串。
- 在创建的资源组中创建具有生成名称的存储帐户。
- 为 Batch 帐户名称生成随机字符串。
- 在创建的资源组中创建具有生成名称的 Batch 帐户,并链接到创建的存储帐户。
- 为 Batch 池生成随机名称。
- 在创建的资源组中创建具有固定规模的 Batch 池,并链接到创建的 Batch 帐户。
- 在创建的资源组中创建带自动缩放的 Batch 池,并链接到创建的 Batch 帐户。
- 输出创建的资源组、存储帐户、Batch 帐户和两个 Batch 池的名称。
先决条件
- 创建具有活动订阅的 Azure 帐户。 你可以免费创建一个帐户。
- 安装和配置Terraform。
实现 Terraform 代码
注释
本文的示例代码位于 Azure Terraform GitHub 存储库中。 你可以查看包含当前和以前 Terraform 版本的测试结果的日志文件。
创建用于测试和运行示例 Terraform 代码的目录,并将其设为当前目录。
创建名为
main.tf的文件并插入以下代码: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 } resource "random_string" "storage_account_name" { length = 8 lower = true numeric = false special = false upper = false } resource "azurerm_storage_account" "example" { name = random_string.storage_account_name.result resource_group_name = azurerm_resource_group.rg.name location = azurerm_resource_group.rg.location account_tier = "Standard" account_replication_type = "LRS" } resource "random_string" "batch_account_name" { length = 8 lower = true numeric = false special = false upper = false } resource "azurerm_batch_account" "example" { name = random_string.batch_account_name.result resource_group_name = azurerm_resource_group.rg.name location = azurerm_resource_group.rg.location storage_account_id = azurerm_storage_account.example.id storage_account_authentication_mode = "StorageKeys" } resource "random_pet" "azurerm_batch_pool_name" { prefix = "pool" } resource "azurerm_batch_pool" "fixed" { name = "${random_pet.azurerm_batch_pool_name.id}-fixed-pool" resource_group_name = azurerm_resource_group.rg.name account_name = azurerm_batch_account.example.name display_name = "Fixed Scale Pool" vm_size = "Standard_D4_v3" node_agent_sku_id = "batch.node.ubuntu 22.04" fixed_scale { target_dedicated_nodes = 2 resize_timeout = "PT15M" } storage_image_reference { publisher = "Canonical" offer = "0001-com-ubuntu-server-jammy" sku = "22_04-lts" version = "latest" } start_task { command_line = "echo 'Hello World from $env'" task_retry_maximum = 1 wait_for_success = true common_environment_properties = { env = "TEST" } user_identity { auto_user { elevation_level = "NonAdmin" scope = "Task" } } } metadata = { "tagName" = "Example tag" } } resource "azurerm_batch_pool" "autopool" { name = "${random_pet.azurerm_batch_pool_name.id}-autoscale-pool" resource_group_name = azurerm_resource_group.rg.name account_name = azurerm_batch_account.example.name display_name = "Auto Scale Pool" vm_size = "Standard_D4_v3" node_agent_sku_id = "batch.node.ubuntu 22.04" auto_scale { evaluation_interval = "PT15M" formula = <<EOF startingNumberOfVMs = 1; maxNumberofVMs = 25; pendingTaskSamplePercent = $PendingTasks.GetSamplePercent(180 * TimeInterval_Second); pendingTaskSamples = pendingTaskSamplePercent < 70 ? startingNumberOfVMs : avg($PendingTasks.GetSample(180 * TimeInterval_Second)); $TargetDedicatedNodes=min(maxNumberofVMs, pendingTaskSamples); EOF } storage_image_reference { publisher = "Canonical" offer = "0001-com-ubuntu-server-jammy" sku = "22_04-lts" version = "latest" } }创建名为
outputs.tf的文件并插入以下代码:output "resource_group_name" { value = azurerm_resource_group.rg.name } output "storage_account_name" { value = azurerm_storage_account.example.name } output "batch_account_name" { value = azurerm_batch_account.example.name } output "batch_pool_fixed_name" { value = azurerm_batch_pool.fixed.name } output "batch_pool_autopool_name" { value = azurerm_batch_pool.autopool.name }创建名为
providers.tf的文件并插入以下代码:terraform { required_version = ">=1.0" required_providers { azurerm = { source = "hashicorp/azurerm" version = "~>3.0" } random = { source = "hashicorp/random" version = "~>3.0" } } } provider "azurerm" { features {} }创建名为
variables.tf的文件并插入以下代码:variable "resource_group_location" { type = string default = "chinaeast2" 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." }
初始化 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。
验证结果
运行 az batch account show 以查看 Batch 帐户。
az batch account show --name <batch_account_name> --resource-group <resource_group_name>
在上述命令中,将 <batch_account_name> 替换为 Batch 帐户的名称,并且将 <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