Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este artículo se muestra cómo crear hosts de sesión e implementarlos en un grupo de hosts de AVD con Terraform. En este artículo se da por supuesto que ya ha implementado la infraestructura de Azure Virtual Desktop.
Artículo probado con las siguientes versiones de Terraform y del proveedor de Terraform:
Más información sobre el uso de Terraform en Azure
En este artículo aprenderá a:
- Uso de Terraform para crear una NIC para cada host de sesión
- Uso de Terraform para crear una máquina virtual para el host de sesión
- Unión de una máquina virtual al dominio
- Registro de máquinas virtuales con Azure Virtual Desktop
- Uso del archivo de variables
1. Configuración del entorno
- Suscripción de Azure: si no tiene una suscripción de Azure, cree una cuenta gratuita antes de comenzar.
Configurar Terraform: si aún no lo ha hecho, configure Terraform con una de las siguientes opciones:
2. Implementación del código de Terraform
Cree un directorio en el que probar el código de ejemplo de Terraform y conviértalo en el directorio actual.
Cree un archivo llamado
providers.tfe inserte el siguiente código.terraform { required_providers { azurerm = { source = "hashicorp/azurerm" version = "~>2.0" } azuread = { source = "hashicorp/azuread" } } } provider "azurerm" { features {} }Puntos clave:
- Use
countpara indicar cuántos recursos se crearán. - Hace referencia a los recursos que se crearon cuando se creó la infraestructura, como
azurerm_subnet.subnet.idyazurerm_virtual_desktop_host_pool.hostpool.name. Si ha cambiado el nombre de estos recursos de esa sección, también debe actualizar las referencias aquí.
- Use
Cree un archivo denominado
main.tfe inserte el siguiente código:locals { registration_token = azurerm_virtual_desktop_host_pool_registration_info.registrationinfo.token } resource "random_string" "AVD_local_password" { count = var.rdsh_count length = 16 special = true min_special = 2 override_special = "*!@#?" } resource "azurerm_resource_group" "rg" { name = var.rg location = var.resource_group_location } resource "azurerm_network_interface" "avd_vm_nic" { count = var.rdsh_count name = "${var.prefix}-${count.index + 1}-nic" resource_group_name = azurerm_resource_group.rg.name location = azurerm_resource_group.rg.location ip_configuration { name = "nic${count.index + 1}_config" subnet_id = azurerm_subnet.subnet.id private_ip_address_allocation = "dynamic" } depends_on = [ azurerm_resource_group.rg ] } resource "azurerm_windows_virtual_machine" "avd_vm" { count = var.rdsh_count name = "${var.prefix}-${count.index + 1}" resource_group_name = azurerm_resource_group.rg.name location = azurerm_resource_group.rg.location size = var.vm_size network_interface_ids = ["${azurerm_network_interface.avd_vm_nic.*.id[count.index]}"] provision_vm_agent = true admin_username = var.local_admin_username admin_password = var.local_admin_password os_disk { name = "${lower(var.prefix)}-${count.index + 1}" caching = "ReadWrite" storage_account_type = "Standard_LRS" } source_image_reference { publisher = "MicrosoftWindowsDesktop" offer = "Windows-10" sku = "20h2-evd" version = "latest" } depends_on = [ azurerm_resource_group.rg, azurerm_network_interface.avd_vm_nic ] } resource "azurerm_virtual_machine_extension" "domain_join" { count = var.rdsh_count name = "${var.prefix}-${count.index + 1}-domainJoin" virtual_machine_id = azurerm_windows_virtual_machine.avd_vm.*.id[count.index] publisher = "Microsoft.Compute" type = "JsonADDomainExtension" type_handler_version = "1.3" auto_upgrade_minor_version = true settings = <<SETTINGS { "Name": "${var.domain_name}", "OUPath": "${var.ou_path}", "User": "${var.domain_user_upn}@${var.domain_name}", "Restart": "true", "Options": "3" } SETTINGS protected_settings = <<PROTECTED_SETTINGS { "Password": "${var.domain_password}" } PROTECTED_SETTINGS lifecycle { ignore_changes = [settings, protected_settings] } depends_on = [ azurerm_virtual_network_peering.peer1, azurerm_virtual_network_peering.peer2 ] } resource "azurerm_virtual_machine_extension" "vmext_dsc" { count = var.rdsh_count name = "${var.prefix}${count.index + 1}-avd_dsc" virtual_machine_id = azurerm_windows_virtual_machine.avd_vm.*.id[count.index] publisher = "Microsoft.Powershell" type = "DSC" type_handler_version = "2.73" auto_upgrade_minor_version = true settings = <<-SETTINGS { "modulesUrl": "https://wvdportalstorageblob.blob.core.windows.net/galleryartifacts/Configuration_1.0.02714.342.zip", "configurationFunction": "Configuration.ps1\\AddSessionHost", "properties": { "HostPoolName":"${azurerm_virtual_desktop_host_pool.hostpool.name}" } } SETTINGS protected_settings = <<PROTECTED_SETTINGS { "properties": { "registrationInfoToken": "${local.registration_token}" } } PROTECTED_SETTINGS depends_on = [ azurerm_virtual_machine_extension.domain_join, azurerm_virtual_desktop_host_pool.hostpool ] }Cree un archivo denominado
variables.tfe inserte el siguiente código:
variable "resource_group_location" {
default = "eastus"
description = "Location of the resource group."
}
variable "rg" {
type = string
default = "rg-avd-compute"
description = "Name of the Resource group in which to deploy session host"
}
variable "rdsh_count" {
description = "Number of AVD machines to deploy"
default = 2
}
variable "prefix" {
type = string
default = "avdtf"
description = "Prefix of the name of the AVD machine(s)"
}
variable "domain_name" {
type = string
default = "infra.local"
description = "Name of the domain to join"
}
variable "domain_user_upn" {
type = string
default = "domainjoineruser" # do not include domain name as this is appended
description = "Username for domain join (do not include domain name as this is appended)"
}
variable "domain_password" {
type = string
default = "ChangeMe123!"
description = "Password of the user to authenticate with the domain"
sensitive = true
}
variable "vm_size" {
description = "Size of the machine to deploy"
default = "Standard_DS2_v2"
}
variable "ou_path" {
default = ""
}
variable "local_admin_username" {
type = string
default = "localadm"
description = "local admin username"
}
variable "local_admin_password" {
type = string
default = "ChangeMe123!"
description = "local admin password"
sensitive = true
}
- Cree un archivo denominado
output.tfe inserte el siguiente código:
output "location" {
description = "The Azure region"
value = azurerm_resource_group.rg.location
}
output "session_host_count" {
description = "The number of VMs created"
value = var.rdsh_count
}
output "dnsservers" {
description = "Custom DNS configuration"
value = azurerm_virtual_network.vnet.dns_servers
}
output "vnetrange" {
description = "Address range for deployment vnet"
value = azurerm_virtual_network.vnet.address_space
}
Cree un archivo denominado
terraform.tfvarse inserte el siguiente código:# Customized the sample values below for your environment and either rename to terraform.tfvars or env.auto.tfvars deploy_location = "west europe" rg_name = "avd-resources-rg" prefix = "avdtf" local_admin_username = "localadm" local_admin_password = "ChangeMe123$" vnet_range = ["10.1.0.0/16"] subnet_range = ["10.1.0.0/24"] dns_servers = ["10.0.1.4", "168.63.129.16"] aad_group_name = "AVDUsers" domain_name = "infra.local" domain_user_upn = "admin" # do not include domain name as this is appended domain_password = "ChangeMe123!" ad_vnet = "infra-network" ad_rg = "infra-rg" avd_users = [ "avduser01@infra.local", "avduser01@infra.local" ]
3. Inicializar Terraform
Ejecute terraform init para inicializar la implementación de Terraform. Este comando descarga el proveedor de Azure necesario para administrar los recursos de Azure.
terraform init -upgrade
Puntos clave:
- El parámetro
-upgradeactualiza los complementos de proveedor necesarios a la versión más reciente que cumpla con las restricciones de versión de la configuración.
4. Creación de un plan de ejecución de Terraform
Ejecute terraform plan para crear un plan de ejecución.
terraform plan -out main.tfplan
Puntos clave:
- El comando
terraform plancrea un plan de ejecución, pero no lo ejecuta. En su lugar, determina qué acciones son necesarias para crear la configuración especificada en los archivos de configuración. Este patrón le permite comprobar si el plan de ejecución coincide con sus expectativas antes de realizar cambios en los recursos reales. - El parámetro opcional
-outpermite especificar un archivo de salida para el plan. El uso del parámetro-outgarantiza que el plan que ha revisado es exactamente lo que se aplica.
5. Aplicación de un plan de ejecución de Terraform
Ejecute terraform apply para aplicar el plan de ejecución a la infraestructura en la nube.
terraform apply main.tfplan
Puntos clave:
- El comando
terraform applyde ejemplo asume que ejecutóterraform plan -out main.tfplanpreviamente. - Si especificó un nombre de archivo diferente para el parámetro
-out, use ese mismo nombre de archivo en la llamada aterraform apply. - Si no ha utilizado el parámetro
-out, llame aterraform applysin ningún parámetro.
6. Comprobación de los resultados
- En Azure Portal, seleccione Azure Virtual Desktop.
- Seleccione Grupos de hosts y, a continuación, el nombre del recurso creado .
- Seleccione Hosts de sesión y compruebe que aparece el host de sesión.
7. Limpieza de recursos
Cuando ya no necesite los recursos creados a través de Terraform, siga estos pasos:
Ejecute terraform plan y especifique el indicador
destroy.terraform plan -destroy -out main.destroy.tfplanPuntos clave:
- El comando
terraform plancrea un plan de ejecución, pero no lo ejecuta. En su lugar, determina qué acciones son necesarias para crear la configuración especificada en los archivos de configuración. Este patrón le permite comprobar si el plan de ejecución coincide con sus expectativas antes de realizar cambios en los recursos reales. - El parámetro opcional
-outpermite especificar un archivo de salida para el plan. El uso del parámetro-outgarantiza que el plan que ha revisado es exactamente lo que se aplica.
- El comando
Ejecute terraform apply para aplicar el plan de ejecución.
terraform apply main.destroy.tfplan
Solución de problemas de Terraform en Azure
Solución de problemas comunes al usar Terraform en Azure