Konfigurieren von Azure Virtual Desktop-Sitzungshosts mit Terraform
In diesem Artikel erfahren Sie, wie Sie Session Hosts erstellen und in einem AVD-Hostpool mit Terraform bereitstellen. In diesem Artikel wird davon ausgegangen, dass Sie bereits die Azure Virtual Desktop Infrastructure bereitgestellt haben.
Artikel, der mit den folgenden Terraform- und Terraform-Anbieterversionen getestet wurde:
Weitere Informationen zur Verwendung von Terraform in Azure
In diesem Artikel werden folgende Vorgehensweisen behandelt:
- Verwenden von Terraform zum Erstellen von NIC für jeden Sitzungshost
- Verwenden von Terraform zum Erstellen eines virtuellen Computers für den Sitzungshost
- Zu erledigende VM beitreten Standard
- Registrieren eines virtuellen Computers mit Azure Virtual Desktop
- Variablendatei verwenden
1. Konfigurieren Ihrer Umgebung
- Azure-Abonnement: Wenn Sie kein Azure-Abonnement besitzen, können Sie ein kostenloses Konto erstellen, bevor Sie beginnen.
Konfigurieren von Terraform: Konfigurieren Sie Terraform mithilfe einer der folgenden Optionen, sofern noch nicht geschehen:
2. Implementieren des Terraform-Codes
Erstellen Sie ein Verzeichnis, in dem der Terraform-Beispielcode getestet werden soll, und legen Sie es als aktuelles Verzeichnis fest.
Erstellen Sie eine Datei namens
providers.tf
, und fügen Sie den folgenden Code ein:terraform { required_providers { azurerm = { source = "hashicorp/azurerm" version = "~>2.0" } azuread = { source = "hashicorp/azuread" } } } provider "azurerm" { features {} }
Die wichtigsten Punkte:
- Hier
count
erfahren Sie, wie viele Ressourcen erstellt werden sollen. - Verweist auf Ressourcen, die beim Erstellen der Infrastruktur erstellt wurden , z
azurerm_subnet.subnet.id
. B. undazurerm_virtual_desktop_host_pool.hostpool.name
. Wenn Sie den Namen dieser Ressourcen aus diesem Abschnitt geändert haben, müssen Sie auch die Verweise hier aktualisieren.
- Hier
Erstellen Sie eine Datei namens
main.tf
, und fügen Sie den folgenden Code ein: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_09-08-2022.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 ] }
Erstellen Sie eine Datei namens
variables.tf
, und fügen Sie den folgenden Code ein:
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
}
- Erstellen Sie eine Datei namens
output.tf
, und fügen Sie den folgenden Code ein:
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
}
Erstellen Sie eine Datei namens
terraform.tfvars
, und fügen Sie den folgenden Code ein:# 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. Initialisieren von Terraform
Führen Sie zum Initialisieren der Terraform-Bereitstellung terraform init aus. Mit diesem Befehl wird der Azure-Anbieter heruntergeladen, der zum Verwalten Ihrer Azure-Ressourcen erforderlich ist.
terraform init -upgrade
Die wichtigsten Punkte:
- Der Parameter
-upgrade
aktualisiert die erforderlichen Anbieter-Plug-Ins auf die neueste Version, die den Versionseinschränkungen der Konfiguration entspricht.
4. Erstellen eines Terraform-Ausführungsplans
Führen Sie terraform plan aus, um einen Ausführungsplan zu erstellen.
terraform plan -out main.tfplan
Die wichtigsten Punkte:
- Durch den Befehl
terraform plan
wird ein Ausführungsplan erstellt, aber nicht ausgeführt. Stattdessen werden die Aktionen ermittelt, die erforderlich sind, um die in Ihren Konfigurationsdateien angegebene Konfiguration zu erstellen. Mit diesem Muster können Sie überprüfen, ob der Ausführungsplan Ihren Erwartungen entspricht, bevor Sie Änderungen an den eigentlichen Ressourcen vornehmen. - Der optionale Parameter
-out
ermöglicht die Angabe einer Ausgabedatei für den Plan. Durch die Verwendung des Parameters-out
wird sichergestellt, dass genau der von Ihnen überprüfte Plan angewendet wird.
5. Anwenden eines Terraform-Ausführungsplans
Führen Sie terraform apply aus, um den Ausführungsplan auf Ihre Cloudinfrastruktur anzuwenden.
terraform apply main.tfplan
Die wichtigsten Punkte:
- Der Beispielbefehl
terraform apply
setzt voraus, dass Sie zuvorterraform plan -out main.tfplan
ausgeführt haben. - Wenn Sie einen anderen Dateinamen für den Parameter
-out
angegeben haben, verwenden Sie denselben Dateinamen im Aufruf vonterraform apply
. - Wenn Sie den Parameter
-out
nicht verwendet haben, rufen Sieterraform apply
ohne Parameter auf.
6. Überprüfen der Ergebnisse
- Wählen Sie im Azure-Portal Azure Virtual Desktop aus.
- Wählen Sie Hostpools und dann den Namen der erstellten Ressource des Pools aus.
- Wählen Sie Sitzungshosts aus, und überprüfen Sie dann, ob der Sitzungshost aufgeführt ist.
7. Bereinigen von Ressourcen
Wenn Sie die über Terraform erstellten Ressourcen nicht mehr benötigen, führen Sie die folgenden Schritte aus:
Führen Sie terraform plan aus, und geben Sie das Flag
destroy
an.terraform plan -destroy -out main.destroy.tfplan
Die wichtigsten Punkte:
- Durch den Befehl
terraform plan
wird ein Ausführungsplan erstellt, aber nicht ausgeführt. Stattdessen werden die Aktionen ermittelt, die erforderlich sind, um die in Ihren Konfigurationsdateien angegebene Konfiguration zu erstellen. Mit diesem Muster können Sie überprüfen, ob der Ausführungsplan Ihren Erwartungen entspricht, bevor Sie Änderungen an den eigentlichen Ressourcen vornehmen. - Der optionale Parameter
-out
ermöglicht die Angabe einer Ausgabedatei für den Plan. Durch die Verwendung des Parameters-out
wird sichergestellt, dass genau der von Ihnen überprüfte Plan angewendet wird.
- Durch den Befehl
Führen Sie zum Anwenden des Ausführungsplans den Befehl terraform apply aus.
terraform apply main.destroy.tfplan
Problembehandlung für Terraform in Azure
Behandeln allgemeiner Probleme bei der Verwendung von Terraform in Azure
Nächste Schritte
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für