使用 Terraform 配置 Azure 虚拟桌面

文章使用以下 Terraform 和 Terraform 提供程序版本进行测试:

使用 Terraform 可以定义、预览和部署云基础结构。 使用 Terraform 时,请使用 HCL 语法来创建配置文件。 利用 HCL 语法,可指定 Azure 这样的云提供程序和构成云基础结构的元素。 创建配置文件后,请创建一个执行计划,利用该计划,可在部署基础结构更改之前先预览这些更改。 验证了更改后,请应用该执行计划以部署基础结构。

本文概述了如何使用 Terraform 部署 ARM Azure 虚拟桌面环境,而不是 AVD 经典环境。

Azure 虚拟桌面有几种先决条件要求

不熟悉 Azure 虚拟桌面? 从 什么是 Azure 虚拟桌面开始?

假定已设置适当的平台基础,该基础可能是 企业规模登陆区域平台基础,也可能不是企业规模登陆区域平台基础。

在本文中,学习如何:

  • 使用 Terraform 创建 Azure 虚拟桌面工作区
  • 使用 Terraform 创建 Azure 虚拟桌面主机池
  • 使用 Terraform 创建 Azure 桌面应用程序组
  • 关联工作区和桌面应用程序组

1.配置环境

  • Azure 订阅:如果没有 Azure 订阅,请在开始之前创建一个免费帐户

2. 实现 Terraform 代码

  1. 创建用于测试和运行示例 Terraform 代码的目录,并将其设为当前目录。

  2. 创建名为 providers.tf 的文件并插入下列代码:

    terraform {
      required_providers {
        azurerm = {
          source  = "hashicorp/azurerm"
          version = "~>2.0"
        }
        azuread = {
          source = "hashicorp/azuread"
        }
      }
    }
    
    provider "azurerm" {
      features {}
    }
    
  3. 创建名为 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
    }
    
  4. 创建名为 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)"
    }
  1. 创建名为 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.rg.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

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. 验证结果

  1. 在Azure 门户上,选择 Azure 虚拟桌面
  2. 选择 主机池 ,然后选择 池创建资源的名称
  3. 选择 “会话主机 ”,然后验证会话主机是否已列出。

7.清理资源

不再需要通过 Terraform 创建的资源时,请执行以下步骤:

  1. 运行 terraform plan 并指定 destroy 标志。

    terraform plan -destroy -out main.destroy.tfplan
    

    要点:

    • terraform plan 命令将创建一个执行计划,但不会执行它。 它会确定创建配置文件中指定的配置需要执行哪些操作。 此模式允许你在对实际资源进行任何更改之前验证执行计划是否符合预期。
    • 使用可选 -out 参数可以为计划指定输出文件。 使用 -out 参数可以确保所查看的计划与所应用的计划完全一致。
    • 若要详细了解如何使执行计划和安全性持久化,请参阅安全警告一节
  2. 运行 terraform apply 以应用执行计划。

    terraform apply main.destroy.tfplan
    

Azure 上的 Terraform 故障排除

排查在 Azure 上使用 Terraform 时遇到的常见问题

后续步骤