在本文中,将使用 Terraform 创建Azure Managed Lustre文件系统。
使用 Terraform 可以定义、预览和部署云基础结构。 使用 Terraform 时,请使用 HCL 语法来创建配置文件。 HCL 语法允许你指定云提供商(如 Azure)和构成云基础结构的元素。 创建配置文件后,可以创建 一个执行计划 ,以便在部署基础结构更改之前预览这些更改。 验证更改后,应用执行计划来部署基础结构。
在这篇文章中,你将学会如何:
- 使用 random_pet创建随机值(要在资源组名称中使用)。
- 使用azurerm_resource_group创建 Azure 资源组。
- 使用azurerm_virtual_network创建 Azure 虚拟网络。
- 使用azurerm_subnet创建 Azure 子网。
- 使用 random_string创建随机值(用作托管 Lustre 文件系统名称)。
- 使用 azurerm_managed_lustre_file_system创建托管 Lustre 文件系统。
Note
本文中的代码示例使用 random_pet 和 random_string 资源为资源组名称和托管 Lustre 文件系统名称生成唯一值。 您可以在 variables.tf 和 main.tf 文件中将这些值替换为您自己的资源名称。
先决条件
实现 Terraform 代码
Note
本文的示例代码来自 Azure Terraform GitHub 存储库。 可以查看包含 Terraform 的当前版本和早期版本中的 测试结果的日志文件。
有关演示如何使用 Terraform 管理Azure资源的更多文章和示例代码,请参阅 Azure 文档中 Terraform 的主页。
创建一个目录,用于测试示例 Terraform 代码,并将其设为当前目录。
创建名为
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 {}
environment = "china"
}
- 创建名为
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" "azurerm_virtual_network_name" {
length = 13
lower = true
numeric = false
special = false
upper = false
}
resource "azurerm_virtual_network" "example" {
name = coalesce(var.virtual_network_name, "vnet-${random_string.azurerm_virtual_network_name.result}")
resource_group_name = azurerm_resource_group.rg.name
address_space = ["10.0.0.0/16"]
location = azurerm_resource_group.rg.location
}
resource "random_string" "azurerm_subnet_name" {
length = 13
lower = true
numeric = false
special = false
upper = false
}
resource "azurerm_subnet" "example" {
name = coalesce(var.subnet_name, "subnet-${random_string.azurerm_subnet_name.result}")
resource_group_name = azurerm_resource_group.rg.name
virtual_network_name = azurerm_virtual_network.example.name
address_prefixes = ["10.0.2.0/24"]
}
resource "random_string" "azurerm_amlfs_name" {
length = 13
lower = true
numeric = false
special = false
upper = false
}
resource "azurerm_managed_lustre_file_system" "example" {
name = coalesce(var.amlfs_name, "amlfs-${random_string.azurerm_amlfs_name.result}")
resource_group_name = azurerm_resource_group.rg.name
location = azurerm_resource_group.rg.location
sku_name = var.amlfs_sku_name
subnet_id = azurerm_subnet.example.id
storage_capacity_in_tb = var.amlfs_storage_capacity_in_tb
zones = ["1"]
maintenance_window {
day_of_week = var.amlfs_maintenance_day_of_week
time_of_day_in_utc = var.amlfs_maintenance_time_of_day
}
}
- 创建名为
variables.tf的文件并插入下列代码:
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 "resource_group_location" {
type = string
default = "chinanorth3"
description = "Location of the resource group."
}
variable "virtual_network_name" {
type = string
description = "The name of the virtual network resource. The value will be randomly generated if blank."
default = ""
}
variable "subnet_name" {
type = string
description = "The name of the virtual network subnet. The value will be randomly generated if blank."
default = ""
}
variable "amlfs_name" {
type = string
description = "The name of the Manage Lustre file system resource. The value will be randomly generated if blank."
default = ""
}
variable "amlfs_sku_name" {
type = string
default = "AMLFS-Durable-Premium-40"
validation {
condition = contains(["AMLFS-Durable-Premium-40", "AMLFS-Durable-Premium-125", "AMLFS-Durable-Premium-250", "AMLFS-Durable-Premium-500"], var.amlfs_sku_name)
error_message = "The SKU value must be one of the following: AMLFS-Durable-Premium-40, AMLFS-Durable-Premium-125, AMLFS-Durable-Premium-250, AMLFS-Durable-Premium-500."
}
description = "SKU name for the Azure Managed Lustre file system."
}
variable "amlfs_storage_capacity_in_tb" {
type = number
default = 48
description = "The size of the Managed Lustre file system, in TiB. This might be rounded up."
}
variable "amlfs_maintenance_day_of_week" {
type = string
default = "Saturday"
validation {
condition = contains(["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], var.amlfs_maintenance_day_of_week)
error_message = "The maintenance day of week value must be one of the following: Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday."
}
description = "Day of the week on which the maintenance window will occur."
}
variable "amlfs_maintenance_time_of_day" {
type = string
default = "02:00"
description = "The time of day (in UTC) to start the maintenance window."
}
- 创建名为
outputs.tf的文件并插入下列代码:
output "resource_group_name" {
value = azurerm_resource_group.rg.name
}
output "virtual_network_name" {
value = azurerm_virtual_network.example.name
}
output "subnet_name" {
value = azurerm_subnet.example.name
}
output "managed_lustre_file_system_name" {
value = azurerm_managed_lustre_file_system.example.name
}
output "amlfs_sku_name" {
value = azurerm_managed_lustre_file_system.example.sku_name
}
output "amlfs_storage_capacity_in_tb" {
value = azurerm_managed_lustre_file_system.example.storage_capacity_in_tb
}
初始化 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。
验证结果
获取Azure资源组的名称:
resource_group_name=$(terraform output -raw resource_group_name)获取托管 Lustre 文件系统的名称:
managed_lustre_file_system_name=$(terraform output -raw managed_lustre_file_system_name)运行 az amlfs show 以显示托管 Lustre 文件系统的名称:
az amlfs show --resource-group $resource_group_name \ --name $managed_lustre_file_system_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 时排查常见问题。