本文已使用以下版本的 Terraform 和 Terraform 提供程序进行了测试:
使用 Terraform 可以定义、预览和部署云基础结构。 使用 Terraform 时,请使用 HCL 语法来创建配置文件。 HCL 语法允许你指定云提供商(如 Azure)和构成云基础结构的元素。 创建配置文件后,请创建一个执行计划,利用该计划,可在部署基础结构更改之前先预览这些更改。 验证更改后,应用执行计划来部署基础结构。
本文概述了如何使用 Terraform 部署 ARM Azure 虚拟桌面环境,而不是 AVD Classic。
Azure 虚拟桌面有几个先决条件要求
不熟悉 Azure 虚拟桌面? 从 什么是 Azure 虚拟桌面开始?
假设已经设置了适当的平台基础,该基础可能是也可能不是 Enterprise Scale Landing Zone 平台基础。
在这篇文章中,你将学会如何:
- 使用 Terraform 创建 Azure 虚拟桌面工作区
- 使用 Terraform 创建 Azure 虚拟桌面主机池
- 使用 Terraform 创建 Azure 桌面应用程序组
- 关联工作区和桌面应用程序组
1.配置环境
- Azure 订阅:如果没有 Azure 订阅,请在开始之前创建 一个免费帐户 。
配置 Terraform:如果尚未执行此操作,请使用以下选项之一配置 Terraform:
2. 实现 Terraform 代码
创建用于测试和运行示例 Terraform 代码的目录,并将其设为当前目录。
创建名为
providers.tf的文件并插入下列代码:terraform { required_providers { azurerm = { source = "hashicorp/azurerm" version = "~>2.0" } azuread = { source = "hashicorp/azuread" } } } provider "azurerm" { features {} }创建名为
main.tf的文件并插入下列代码:# Resource group name is output when execution plan is applied. resource "azurerm_resource_group" "sh" { name = var.rg_name location = var.resource_group_location } # Create AVD workspace resource "azurerm_virtual_desktop_workspace" "workspace" { name = var.workspace resource_group_name = azurerm_resource_group.sh.name location = azurerm_resource_group.sh.location friendly_name = "${var.prefix} Workspace" description = "${var.prefix} Workspace" } # Create AVD host pool resource "azurerm_virtual_desktop_host_pool" "hostpool" { resource_group_name = azurerm_resource_group.sh.name location = azurerm_resource_group.sh.location name = var.hostpool friendly_name = var.hostpool validate_environment = true custom_rdp_properties = "audiocapturemode:i:1;audiomode:i:0;" description = "${var.prefix} Terraform HostPool" type = "Pooled" maximum_sessions_allowed = 16 load_balancer_type = "DepthFirst" #[BreadthFirst DepthFirst] } resource "azurerm_virtual_desktop_host_pool_registration_info" "registrationinfo" { hostpool_id = azurerm_virtual_desktop_host_pool.hostpool.id expiration_date = var.rfc3339 } # Create AVD DAG resource "azurerm_virtual_desktop_application_group" "dag" { resource_group_name = azurerm_resource_group.sh.name host_pool_id = azurerm_virtual_desktop_host_pool.hostpool.id location = azurerm_resource_group.sh.location type = "Desktop" name = "${var.prefix}-dag" friendly_name = "Desktop AppGroup" description = "AVD application group" depends_on = [azurerm_virtual_desktop_host_pool.hostpool, azurerm_virtual_desktop_workspace.workspace] } # Associate Workspace and DAG resource "azurerm_virtual_desktop_workspace_application_group_association" "ws-dag" { application_group_id = azurerm_virtual_desktop_application_group.dag.id workspace_id = azurerm_virtual_desktop_workspace.workspace.id }创建名为
variables.tf的文件并插入下列代码:variable "resource_group_location" { default = "eastus" description = "Location of the resource group." } variable "rg_name" { type = string default = "rg-avd-resources" description = "Name of the Resource group in which to deploy service objects" } variable "workspace" { type = string description = "Name of the Azure Virtual Desktop workspace" default = "AVD TF Workspace" } variable "hostpool" { type = string description = "Name of the Azure Virtual Desktop host pool" default = "AVD-TF-HP" } variable "rfc3339" { type = string default = "2022-03-30T12:43:13Z" description = "Registration token expiration" } variable "prefix" { type = string default = "avdtf" description = "Prefix of the name of the AVD machine(s)" }创建名为
output.tf的文件并插入下列代码:output "azure_virtual_desktop_compute_resource_group" { description = "Name of the Resource group in which to deploy session host" value = azurerm_resource_group.sh.name } output "azure_virtual_desktop_host_pool" { description = "Name of the Azure Virtual Desktop host pool" value = azurerm_virtual_desktop_host_pool.hostpool.name } output "azurerm_virtual_desktop_application_group" { description = "Name of the Azure Virtual Desktop DAG" value = azurerm_virtual_desktop_application_group.dag.name } output "azurerm_virtual_desktop_workspace" { description = "Name of the Azure Virtual Desktop workspace" value = azurerm_virtual_desktop_workspace.workspace.name } output "location" { description = "The Azure region" value = azurerm_resource_group.sh.location } output "AVD_user_groupname" { description = "Azure Active Directory Group for AVD users" value = azuread_group.aad_group.display_name }
3.初始化 Terraform
运行 terraform init,将 Terraform 部署进行初始化。 此命令下载 Azure 提供程序,以便管理您的 Azure 资源。
terraform init -upgrade
要点:
- 参数
-upgrade可将必要的提供程序插件升级到符合配置版本约束的最新版本。
4.创建 Terraform 执行计划
运行 terraform plan 以创建执行计划。
terraform plan -out main.tfplan
要点:
-
terraform plan命令创建执行计划,但不执行它。 相反,它会确定需要执行哪些操作,以创建配置文件中指定的配置。 此模式允许你在对实际资源进行任何更改之前验证执行计划是否符合预期。 - 使用可选
-out参数可以为计划指定输出文件。 使用-out参数可以确保所查看的计划与所应用的计划完全一致。
5. 应用 Terraform 的执行计划
运行 terraform apply 以将执行计划应用到您的云基础架构。
terraform apply main.tfplan
要点:
- 示例
terraform apply命令假设你先前运行了terraform plan -out main.tfplan。 - 如果为
-out参数指定了不同的文件名,请在对terraform apply的调用中使用该相同文件名。 - 如果未使用
-out参数,请调用不带任何参数的terraform apply。
6. 验证结果
- 在 Azure 门户上,选择“ Azure 虚拟桌面”。
- 选择 Host pools(主机池 ),然后选择 Name(名称)池创建的 资源。
- 选择 Session hosts(会话主机 ),然后验证是否列出了会话主机。
7.清理资源
不再需要通过 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 时遇到的常见问题