Esercitazione: Creare un set di scalabilità di macchine virtuali di Azure tramite TerraformTutorial: Create an Azure virtual machine scale set using Terraform

I set di scalabilità di macchine virtuali di Azure consentono di configurare VM identiche.Azure virtual machine scale sets allow you to configure identical VMs. Il numero di istanze di VM può essere modificato in base alla richiesta o a una pianificazione.The number of VM instances can adjust based on demand or a schedule. Per altre informazioni, vedere Ridimensionare automaticamente un set di scalabilità di macchine virtuali nel portale di Azure.For more information, see Automatically scale a virtual machine scale set in the Azure portal.

Questa esercitazione illustra come usare Azure Cloud Shell per eseguire le attività seguenti:In this tutorial, you learn how to use Azure Cloud Shell to do the following tasks:

  • Configurare una distribuzione di TerraformSet up a Terraform deployment
  • Usare variabili e output per la distribuzione di TerraformUse variables and outputs for Terraform deployment
  • Creare e distribuire l'infrastruttura di reteCreate and deploy network infrastructure
  • Creare e distribuire un set di scalabilità di macchine virtuali e collegarlo alla reteCreate and deploy a virtual machine scale set and attach it to the network
  • Creare e distribuire un jumpbox per connettersi alle macchine virtuali tramite SSHCreate and deploy a jumpbox to connect to the VMs via SSH

Nota

La versione più recente dei file di configurazione di Terraform in uso in questo articolo si trova nel repository Awesome Terraform su GitHub.The most recent version of the Terraform configuration files used in this article are in the Awesome Terraform repository on GitHub.

PrerequisitiPrerequisites

Creare la struttura di directoryCreate the directory structure

  1. Accedere al portale di Azure.Browse to the Azure portal.

  2. Aprire Azure Cloud Shell.Open Azure Cloud Shell. Se in precedenza non è stato selezionato un ambiente, selezionare Bash come ambiente.If you didn't select an environment previously, select Bash as your environment.

    Prompt di Cloud Shell

  3. Passare alla directory clouddrive.Change directories to the clouddrive directory.

    cd clouddrive
    
  4. Crea una directory denominata vmss.Create a directory named vmss.

    mkdir vmss
    
  5. Passare alla nuova directory:Change directories to the new directory:

    cd vmss
    

Creare il file di definizioni delle variabiliCreate the variables definitions file

In questa sezione vengono definite le variabili che consentono di personalizzare le risorse create da Terraform.In this section, you define the variables that customize the resources created by Terraform.

In Azure Cloud Shell seguire questa procedura:Within the Azure Cloud Shell, do the following steps:

  1. Creare un file denominato variables.tf.Create a file named variables.tf.

    code variables.tf
    
  2. Incollare il codice seguente nell'editor:Paste the following code into the editor:

    variable "location" {
     description = "The location where resources will be created"
    }
    
    variable "tags" {
     description = "A map of the tags to use for the resources that are deployed"
     type        = "map"
    
     default = {
       environment = "codelab"
     }
    }
    
    variable "resource_group_name" {
     description = "The name of the resource group in which the resources will be created"
     default     = "myResourceGroup"
    }
    
  3. Salvare il file ( <CTRL+S) e uscire dall'editor ( <CTRL+Q).Save the file (<Ctrl>S) and exit the editor (<Ctrl>Q).

Creare il file di definizioni di outputCreate the output definitions file

In questa sezione viene illustrato come creare il file che descrive l'output dopo la distribuzione.In this section, you create the file that describes the output after deployment.

In Azure Cloud Shell seguire questa procedura:Within the Azure Cloud Shell, do the following steps:

  1. Creare un file denominato output.tf.Create a file named output.tf.

    code output.tf
    
  2. Incollare il codice seguente nell'editor per esporre il nome di dominio completo (FQDN) per le macchine virtuali.Paste the following code into the editor to expose the fully qualified domain name (FQDN) for the virtual machines. ::

     output "vmss_public_ip" {
         value = azurerm_public_ip.vmss.fqdn
     }
    
  3. Salvare il file ( <CTRL+S) e uscire dall'editor ( <CTRL+Q).Save the file (<Ctrl>S) and exit the editor (<Ctrl>Q).

Definire l'infrastruttura di rete in un modelloDefine the network infrastructure in a template

In questa sezione viene illustrato come creare l'infrastruttura di rete seguente in un nuovo gruppo di risorse di Azure:In this section, you create the following network infrastructure in a new Azure resource group:

  • Una rete virtuale con lo spazio indirizzi 10.0.0.0/16One virtual network (VNET) with the address space of 10.0.0.0/16
  • Una subnet con lo spazio indirizzi 10.0.2.0/24One subnet with the address space of 10.0.2.0/24
  • Due indirizzi IP pubblici.Two public IP addresses. Uno viene usato dal servizio di bilanciamento del carico del set di scalabilità di macchine virtuali, l'altro viene usato per la connessione al jumpbox SSH.One used by the virtual machine scale set load balancer, the other used to connect to the SSH jumpbox.

In Azure Cloud Shell seguire questa procedura:Within the Azure Cloud Shell, do the following steps:

  1. Creare un file denominato vmss.tf per descrivere l'infrastruttura del set di scalabilità di macchine virtuali.Create a file named vmss.tf to describe the virtual machine scale set infrastructure.

    code vmss.tf
    
  2. Incollare il codice seguente alla fine del file per esporre il nome di dominio completo (FQDN) per le macchine virtuali.Paste the following code to the end of the file to expose the fully qualified domain name (FQDN) for the virtual machines.

    resource "azurerm_resource_group" "vmss" {
     name     = var.resource_group_name
     location = var.location
     tags     = var.tags
    }
    
    resource "random_string" "fqdn" {
     length  = 6
     special = false
     upper   = false
     number  = false
    }
    
    resource "azurerm_virtual_network" "vmss" {
     name                = "vmss-vnet"
     address_space       = ["10.0.0.0/16"]
     location            = var.location
     resource_group_name = azurerm_resource_group.vmss.name
     tags                = var.tags
    }
    
    resource "azurerm_subnet" "vmss" {
     name                 = "vmss-subnet"
     resource_group_name  = azurerm_resource_group.vmss.name
     virtual_network_name = azurerm_virtual_network.vmss.name
     address_prefix       = "10.0.2.0/24"
    }
    
    resource "azurerm_public_ip" "vmss" {
     name                         = "vmss-public-ip"
     location                     = var.location
     resource_group_name          = azurerm_resource_group.vmss.name
     allocation_method = "Static"
     domain_name_label            = random_string.fqdn.result
     tags                         = var.tags
    }
    
  3. Salvare il file ( <CTRL+S) e uscire dall'editor ( <CTRL+Q).Save the file (<Ctrl>S) and exit the editor (<Ctrl>Q).

Effettuare il provisioning dell'infrastruttura di reteProvision the network infrastructure

Usando Azure Cloud Shell dalla directory in cui sono stati creati i file di configurazione (con estensione tf), seguire questa procedura:Using the Azure Cloud Shell from the directory where you created the configuration files (.tf) do the following steps:

  1. Inizializzare Terraform.Initialize Terraform.

    terraform init
    
  2. Eseguire il comando seguente per distribuire l'infrastruttura definita in Azure.Run the following command to deploy the defined infrastructure in Azure.

    terraform apply
    

    Terraform chiede di specificare un valore per location perché la variabile location è definita in variables.tf, ma non viene mai impostata.Terraform prompts you for a location value as the location variable is defined in variables.tf, but it's never set. È possibile immettere una qualsiasi posizione valida, ad esempio "Stati Uniti occidentali" e quindi premere INVIOYou can enter any valid location - such as "West US" followed by selecting Enter. (racchiudere tra parentesi i valori contenenti spazi).(Use parentheses around any value with spaces.)

  3. Terraform stampa l'output come definito nel file output.tf.Terraform prints the output as defined in the output.tf file. Come illustrato nello screenshot seguente, il formato del nome di dominio completo sarà: <ID>.<location>.cloudapp.azure.com.As shown in the following screenshot, the FQDN takes the following form: <ID>.<location>.cloudapp.azure.com. L'ID è un valore calcolato, mentre la posizione è il valore specificato durante l'esecuzione di Terraform.The ID is a computed value and location is the value provide when running Terraform.

    Nome di dominio completo del set di scalabilità di macchine virtuali per l'indirizzo IP pubblico

  4. Nel menu principale del portale di Azure selezionare Gruppi di risorse.In the Azure portal menu, select Resource groups from the main menu.

  5. Nella scheda Gruppi di risorse selezionare myResourceGroup per visualizzare le risorse che sono state create da Terraform.On the Resource groups tab, select myResourceGroup to view the resources that were created by Terraform. Risorse di rete del set di scalabilità di macchine virtualiVirtual machine scale set network resources

Aggiungere un set di scalabilità di macchine virtualiAdd a virtual machine scale set

In questa sezione viene illustrato come aggiungere al modello le risorse seguenti:In this section, you learn how to add the following resources to the template:

  • Un servizio di bilanciamento del carico di Azure e le regole per gestire l'applicazione e collegarla all'indirizzo IP pubblico configurato in precedenza in questo articoloAn Azure load balancer and rules to serve the application and attach it to the public IP address configured earlier in this article
  • Un pool di indirizzi back-end di Azure da assegnare al servizio di bilanciamento del caricoAn Azure backend address pool and assign it to the load balancer
  • Una porta probe di integrità usata dall'applicazione e configurata nel servizio di bilanciamento del caricoA health probe port used by the application and configured on the load balancer
  • Un set di scalabilità di macchine virtuali posto dietro il servizio di bilanciamento del carico in esecuzione nella rete virtuale distribuita in precedenza in questo articoloA virtual machine scale set sitting behind the load balancer that runs on the VNET deployed earlier in this article
  • Nginx nei nodi del set di scalabilità di macchine virtuali usando cloud-init.Nginx on the nodes of the virtual machine scale using cloud-init.

In Cloud Shell seguire questa procedura:In Cloud Shell, do the following steps:

  1. Aprire il file di configurazione vmss.tf.Open the vmss.tf configuration file.

    code vmss.tf
    
  2. Andare alla fine del file e attivare la modalità Append con il tasto A.Go to the end of the file and enter append mode by selecting the A key.

  3. Incollare il codice seguente alla fine del file:Paste the following code to the end of the file:

    resource "azurerm_lb" "vmss" {
     name                = "vmss-lb"
     location            = var.location
     resource_group_name = azurerm_resource_group.vmss.name
    
     frontend_ip_configuration {
       name                 = "PublicIPAddress"
       public_ip_address_id = azurerm_public_ip.vmss.id
     }
    
     tags = var.tags
    }
    
    resource "azurerm_lb_backend_address_pool" "bpepool" {
     resource_group_name = azurerm_resource_group.vmss.name
     loadbalancer_id     = azurerm_lb.vmss.id
     name                = "BackEndAddressPool"
    }
    
    resource "azurerm_lb_probe" "vmss" {
     resource_group_name = azurerm_resource_group.vmss.name
     loadbalancer_id     = azurerm_lb.vmss.id
     name                = "ssh-running-probe"
     port                = var.application_port
    }
    
    resource "azurerm_lb_rule" "lbnatrule" {
       resource_group_name            = azurerm_resource_group.vmss.name
       loadbalancer_id                = azurerm_lb.vmss.id
       name                           = "http"
       protocol                       = "Tcp"
       frontend_port                  = var.application_port
       backend_port                   = var.application_port
       backend_address_pool_id        = azurerm_lb_backend_address_pool.bpepool.id
       frontend_ip_configuration_name = "PublicIPAddress"
       probe_id                       = azurerm_lb_probe.vmss.id
    }
    
    resource "azurerm_virtual_machine_scale_set" "vmss" {
     name                = "vmscaleset"
     location            = var.location
     resource_group_name = azurerm_resource_group.vmss.name
     upgrade_policy_mode = "Manual"
    
     sku {
       name     = "Standard_DS1_v2"
       tier     = "Standard"
       capacity = 2
     }
    
     storage_profile_image_reference {
       publisher = "Canonical"
       offer     = "UbuntuServer"
       sku       = "16.04-LTS"
       version   = "latest"
     }
    
     storage_profile_os_disk {
       name              = ""
       caching           = "ReadWrite"
       create_option     = "FromImage"
       managed_disk_type = "Standard_LRS"
     }
    
     storage_profile_data_disk {
       lun          = 0
       caching        = "ReadWrite"
       create_option  = "Empty"
       disk_size_gb   = 10
     }
    
     os_profile {
       computer_name_prefix = "vmlab"
       admin_username       = var.admin_user
       admin_password       = var.admin_password
       custom_data          = file("web.conf")
     }
    
     os_profile_linux_config {
       disable_password_authentication = false
     }
    
     network_profile {
       name    = "terraformnetworkprofile"
       primary = true
    
       ip_configuration {
         name                                   = "IPConfiguration"
         subnet_id                              = azurerm_subnet.vmss.id
         load_balancer_backend_address_pool_ids = [azurerm_lb_backend_address_pool.bpepool.id]
         primary = true
       }
     }
    
     tags = var.tags
    }
    
  4. Salvare il file e chiudere l'editor vi immettendo il comando seguente:Save the file and exit the vi editor by entering the following command:

    :wq
    
  5. Creare un file denominato web.conf da usare come configurazione cloud-init per le macchine virtuali che fanno parte del set di scalabilità.Create a file named web.conf to serve as the cloud-init configuration for the virtual machines that are part of the scale set.

    code web.conf
    
  6. Incollare il codice seguente nell'editor:Paste the following code into the editor:

    #cloud-config
    packages:
     - nginx
    
  7. Salvare il file e chiudere l'editor vi immettendo il comando seguente:Save the file and exit the vi editor by entering the following command:

    :wq
    
  8. Aprire il file di configurazione variables.tf.Open the variables.tf configuration file.

    code variables.tf
    
  9. Andare alla fine del file e attivare la modalità Append con il tasto A.Go to the end of the file and enter append mode by selecting the A key.

  10. Personalizzare la distribuzione incollando il codice seguente alla fine del file:Customize the deployment by pasting the following code to the end of the file:

    variable "application_port" {
       description = "The port that you want to expose to the external load balancer"
       default     = 80
    }
    
    variable "admin_user" {
       description = "User name to use as the admin account on the VMs that will be part of the VM Scale Set"
       default     = "azureuser"
    }
    
    variable "admin_password" {
       description = "Default password for admin account"
    }
    
  11. Salvare il file ( <CTRL+S) e uscire dall'editor ( <CTRL+Q).Save the file (<Ctrl>S) and exit the editor (<Ctrl>Q).

  12. Creare un piano Terraform per visualizzare la distribuzione del set di scalabilità di macchine virtuali.Create a Terraform plan to visualize the virtual machine scale set deployment. È necessario specificare una password a scelta, nonché la posizione per le risorse.(You need to specify a password of your choosing, as well as the location for your resources.)

    terraform plan
    

    L'output del comando dovrebbe essere simile a quello illustrato nello screenshot seguente:The output of the command should be similar to the following screenshot:

    Output della creazione del set di scalabilità di macchine virtuali

  13. Distribuire le nuove risorse in Azure.Deploy the new resources in Azure.

    terraform apply
    

    L'output del comando dovrebbe essere simile a quello illustrato nello screenshot seguente:The output of the command should be similar to the following screenshot:

    Gruppo di risorse del set di scalabilità di macchine virtuali di Terraform

  14. Aprire un browser e connettersi all'FQDN restituito dal comando.Open a browser and connect to the FQDN that was returned by the command.

    Risultati della connessione all'FQDN

Aggiungere un jumpbox SSHAdd an SSH jumpbox

Un jumpbox SSH è un server singolo usato come tramite per poter accedere ad altri server nella rete.An SSH jumpbox is a single server that you "jump" through to access other servers on the network. In questo passaggio vengono configurate le risorse seguenti:In this step, you configure the following resources:

  • Un'interfaccia di rete (o jumpbox) connessa alla stessa subnet del set di scalabilità di macchine virtuali.A network interface (or jumpbox) connected to the same subnet as the virtual machine scale set.

  • Una macchina virtuale connessa a questa interfaccia di rete.A virtual machine connected with this network interface. Questo "jumpbox" è accessibile in remoto.This 'jumpbox' is remotely accessible. Dopo avere stabilito la connessione, è possibile eseguire SSH in qualsiasi macchina virtuale nel set di scalabilità.Once connected, you can SSH to any of the virtual machines in the scale set.

  1. Aprire il file di configurazione vmss.tf.Open the vmss.tf configuration file.

    code vmss.tf
    
  2. Andare alla fine del file e attivare la modalità Append con il tasto A.Go to the end of the file and enter append mode by selecting the A key.

  3. Incollare il codice seguente alla fine del file:Paste the following code to the end of the file:

    resource "azurerm_public_ip" "jumpbox" {
     name                         = "jumpbox-public-ip"
     location                     = var.location
     resource_group_name          = azurerm_resource_group.vmss.name
     allocation_method = "Static"
     domain_name_label            = "${random_string.fqdn.result}-ssh"
     tags                         = var.tags}
    }
    
    resource "azurerm_network_interface" "jumpbox" {
     name                = "jumpbox-nic"
     location            = var.location
     resource_group_name = azurerm_resource_group.vmss.name
    
     ip_configuration {
       name                          = "IPConfiguration"
       subnet_id                     = azurerm_subnet.vmss.id
       private_ip_address_allocation = "dynamic"
       public_ip_address_id          = azurerm_public_ip.jumpbox.id
     }
    
     tags = var.tags
    }
    
    resource "azurerm_virtual_machine" "jumpbox" {
     name                  = "jumpbox"
     location              = var.location
     resource_group_name   = azurerm_resource_group.vmss.name
     network_interface_ids = [azurerm_network_interface.jumpbox.id]
     vm_size               = "Standard_DS1_v2"
    
     storage_image_reference {
       publisher = "Canonical"
       offer     = "UbuntuServer"
       sku       = "16.04-LTS"
       version   = "latest"
     }
    
     storage_os_disk {
       name              = "jumpbox-osdisk"
       caching           = "ReadWrite"
       create_option     = "FromImage"
       managed_disk_type = "Standard_LRS"
     }
    
     os_profile {
       computer_name  = "jumpbox"
       admin_username = var.admin_user
       admin_password = var.admin_password
     }
    
     os_profile_linux_config {
       disable_password_authentication = false
     }
    
     tags = var.tags
    }
    
  4. Aprire il file di configurazione output.tf.Open the output.tf configuration file.

    code output.tf
    
  5. Andare alla fine del file e attivare la modalità Append con il tasto A.Go to the end of the file and enter append mode by selecting the A key.

  6. Incollare il codice seguente alla fine del file per visualizzare il nome host del jumpbox al termine della distribuzione:Paste the following code to the end of the file to display the hostname of the jumpbox when the deployment is complete:

    output "jumpbox_public_ip" {
       value = azurerm_public_ip.jumpbox.fqdn
    }
    
  7. Salvare il file ( <CTRL+S) e uscire dall'editor ( <CTRL+Q).Save the file (<Ctrl>S) and exit the editor (<Ctrl>Q).

  8. Distribuire il jumpbox.Deploy the jumpbox.

    terraform apply
    

Al termine della distribuzione, il contenuto del gruppo di risorse è simile a quello illustrato nello screenshot seguente:Once the deployment has completed, the content of the resource group resembles that shown in the following screenshot:

Gruppo di risorse del set di scalabilità di macchine virtuali di Terraform

Nota

La possibilità di accedere con una password è disabilitata nel jumpbox e nel set di scalabilità di macchine virtuali distribuito.The ability to log in with a password is disabled on the jumpbox and the virtual machine scale set that you deployed. Accedere con SSH per accedere alle macchine virtuali.Log in with SSH to access the virtual machine(s).

Pulizia dell'ambienteEnvironment cleanup

Per eliminare le risorse di Terraform che sono state create in questa esercitazione, immettere il comando seguente in Cloud Shell:To delete the Terraform resources that were created in this tutorial, enter the following command into Cloud Shell:

terraform destroy

Il processo di eliminazione può richiedere alcuni minuti.The destruction process can take several minutes to complete.

Passaggi successiviNext steps