Configurare Impostazioni di rete di Desktop virtuale Azure con Terraform

Articolo testato con le versioni del provider Terraform e Terraform seguenti:

Terraform consente di definire, visualizzare in anteprima e distribuire l'infrastruttura cloud. Con Terraform è possibile creare file di configurazione usando la sintassi HCL. La sintassi HCL consente di specificare il provider di servizi cloud, ad esempio Azure, e gli elementi che costituiscono l'infrastruttura cloud. Dopo aver creato i file di configurazione, è necessario creare un piano di esecuzione che consenta di visualizzare in anteprima le modifiche apportate all'infrastruttura prima che vengano distribuite. Dopo aver verificato le modifiche, è possibile applicare il piano di esecuzione per distribuire l'infrastruttura.

Questo articolo offre una panoramica di come usare Terraform per configurare le impostazioni di rete per Desktop virtuale Azure.

In questo articolo vengono illustrate le operazioni seguenti:

  • Usare Terraform per creare una rete virtuale
  • Usare Terraform per creare una subnet
  • Usare Terraform per creare un gruppo di sicurezza di rete
  • Peering della rete virtuale Desktop virtuale Azure con la rete virtuale dell'hub

1. Configurare l'ambiente

  • Sottoscrizione di Azure: se non si ha una sottoscrizione di Azure, creare un account gratuito prima di iniziare.

2. Implementare il codice Terraform

  1. Creare una directory in cui testare il codice Terraform di esempio e impostarla come directory corrente.

  2. Creare un file denominato providers.tf e inserire il codice seguente:

    terraform {
      required_providers {
        azurerm = {
          source  = "hashicorp/azurerm"
          version = "~>2.0"
        }
        azuread = {
          source = "hashicorp/azuread"
        }
      }
    }
    
    provider "azurerm" {
      features {}
    }
    
  3. Creare un file denominato main.tf e inserire il codice seguente:

    resource "azurerm_virtual_network" "vnet" {
      name                = "${var.prefix}-VNet"
      address_space       = var.vnet_range
      dns_servers         = var.dns_servers
      location            = var.deploy_location
      resource_group_name = var.rg_name
      depends_on          = [azurerm_resource_group.rg]
    }
    
    resource "azurerm_subnet" "subnet" {
      name                 = "default"
      resource_group_name  = var.rg_name
      virtual_network_name = azurerm_virtual_network.vnet.name
      address_prefixes     = var.subnet_range
      depends_on           = [azurerm_resource_group.rg]
    }
    
    resource "azurerm_network_security_group" "nsg" {
      name                = "${var.prefix}-NSG"
      location            = var.deploy_location
      resource_group_name = var.rg_name
      security_rule {
        name                       = "HTTPS"
        priority                   = 1001
        direction                  = "Inbound"
        access                     = "Allow"
        protocol                   = "Tcp"
        source_port_range          = "*"
        destination_port_range     = "443"
        source_address_prefix      = "*"
        destination_address_prefix = "*"
      }
      depends_on = [azurerm_resource_group.rg]
    }
    
    resource "azurerm_subnet_network_security_group_association" "nsg_assoc" {
      subnet_id                 = azurerm_subnet.subnet.id
      network_security_group_id = azurerm_network_security_group.nsg.id
    }
    
    data "azurerm_virtual_network" "ad_vnet_data" {
      name                = var.ad_vnet
      resource_group_name = var.ad_rg
    }
    
    resource "azurerm_virtual_network_peering" "peer1" {
      name                      = "peer_avdspoke_ad"
      resource_group_name       = var.rg_name
      virtual_network_name      = azurerm_virtual_network.vnet.name
      remote_virtual_network_id = data.azurerm_virtual_network.ad_vnet_data.id
    }
    resource "azurerm_virtual_network_peering" "peer2" {
      name                      = "peer_ad_avdspoke"
      resource_group_name       = var.ad_rg
      virtual_network_name      = var.ad_vnet
      remote_virtual_network_id = azurerm_virtual_network.vnet.id
    }
    
  4. Creare un file denominato variables.tf e inserire il codice seguente:

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 "rg_shared_name" {
  type        = string
  default     = "rg-shared-resources"
  description = "Name of the Resource group in which to deploy shared resources"
}

variable "deploy_location" {
  type        = string
  default     = "eastus"
  description = "The Azure Region in which all resources in this example should be created."
}

variable "ad_vnet" {
  type        = string
  default     = "infra-network"
  description = "Name of domain controller vnet"
}

variable "dns_servers" {
  type        = list(string)
  default     = ["10.0.1.4", "168.63.129.16"]
  description = "Custom DNS configuration"
}

variable "vnet_range" {
  type        = list(string)
  default     = ["10.2.0.0/16"]
  description = "Address range for deployment VNet"
}
variable "subnet_range" {
  type        = list(string)
  default     = ["10.2.0.0/24"]
  description = "Address range for session host subnet"
}

variable "prefix" {
  type        = string
  default     = "avdtf"
  description = "Prefix of the name of the AVD machine(s)"
}
  1. Creare un file denominato output.tf e inserire il codice seguente:
output "location" {
  description = "The Azure region"
  value       = azurerm_resource_group.rg.location
}

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
}

3. Inizializzare Terraform

Per inizializzare la distribuzione di Terraform, eseguire terraform init. Questo comando scarica il provider di Azure necessario per gestire le risorse di Azure.

terraform init -upgrade

Punti principali:

  • Il parametro -upgrade aggiorna i plug-in del provider necessari alla versione più recente conforme ai vincoli di versione della configurazione.

4. Creare un piano di esecuzione terraform

Eseguire terraform plan per creare un piano di esecuzione.

terraform plan -out main.tfplan

Punti principali:

  • Il comando terraform plan consente di creare un piano di esecuzione, ma non di eseguirlo. Determina invece le azioni necessarie per creare la configurazione specificata nei file di configurazione. Questo modello consente di verificare se il piano di esecuzione corrisponde alle aspettative prima di apportare modifiche alle risorse effettive.
  • Il parametro -out facoltativo consente di specificare un file di output per il piano. L'uso del parametro -out garantisce che il piano esaminato sia esattamente quello che viene applicato.

5. Applicare un piano di esecuzione terraform

Eseguire terraform apply per applicare il piano di esecuzione all'infrastruttura cloud.

terraform apply main.tfplan

Punti principali:

  • Il comando terraform apply di esempio presuppone che in precedenza sia stato eseguito terraform plan -out main.tfplan.
  • Se è stato specificato un nome di file diverso per il parametro -out, usare lo stesso nome di file nella chiamata a terraform apply.
  • Se non è stato usato il parametro -out, chiamare terraform apply senza parametri.

6. Verificare i risultati

  1. Nella portale di Azure selezionare Desktop virtuale Azure.
  2. Selezionare Pool di host e quindi nome della risorsa creata dal pool.
  3. Selezionare Host sessione e quindi verificare che l'host di sessione sia elencato.

7. Pulire le risorse

Quando le risorse create tramite Terraform non sono più necessarie, eseguire i passaggi seguenti:

  1. Eseguire il piano Terraform e specificare il flag destroy.

    terraform plan -destroy -out main.destroy.tfplan
    

    Punti principali:

    • Il comando terraform plan consente di creare un piano di esecuzione, ma non di eseguirlo. Determina invece le azioni necessarie per creare la configurazione specificata nei file di configurazione. Questo modello consente di verificare se il piano di esecuzione corrisponde alle aspettative prima di apportare modifiche alle risorse effettive.
    • Il parametro -out facoltativo consente di specificare un file di output per il piano. L'uso del parametro -out garantisce che il piano esaminato sia esattamente quello che viene applicato.
  2. Eseguire terraform apply per applicare il piano di esecuzione.

    terraform apply main.destroy.tfplan
    

Risolvere i problemi di Terraform in Azure

Risolvere i problemi comuni relativi all'uso di Terraform in Azure

Passaggi successivi