Tutorial: Erstellen einer Azure-VM-Skalierungsgruppe unter Verwendung von TerraformTutorial: Create an Azure virtual machine scale set using Terraform

Azure-VM-Skalierungsgruppen ermöglichen die Konfiguration identischer virtueller Computer.Azure virtual machine scale sets allow you to configure identical VMs. Die Anzahl von VM-Instanzen kann bedarfs- zeitplangesteuert angepasst werden.The number of VM instances can adjust based on demand or a schedule. Weitere Informationen finden Sie unter Automatisches Skalieren einer VM-Skalierungsgruppe im Azure-Portal.For more information, see Automatically scale a virtual machine scale set in the Azure portal.

In diesem Tutorial erfahren Sie, wie Sie Azure Cloud Shell verwenden, um folgende Aufgaben auszuführen:In this tutorial, you learn how to use Azure Cloud Shell to do the following tasks:

  • Einrichten einer Terraform-BereitstellungSet up a Terraform deployment
  • Verwenden von Variablen und Ausgaben für die Terraform-BereitstellungUse variables and outputs for Terraform deployment
  • Erstellen und Bereitstellen der NetzwerkinfrastrukturCreate and deploy network infrastructure
  • Erstellen und Bereitstellen einer VM-Skalierungsgruppe und Anfügen an das NetzwerkCreate and deploy a virtual machine scale set and attach it to the network
  • Erstellen und Bereitstellen einer Jumpbox zum Herstellen einer SSH-Verbindung mit den virtuellen ComputernCreate and deploy a jumpbox to connect to the VMs via SSH

Hinweis

Die neueste Version der in diesem Artikel verwendeten Terraform-Konfigurationsdateien befinden sich im Repository „awesome-terraform“ auf GitHub.The most recent version of the Terraform configuration files used in this article are in the Awesome Terraform repository on GitHub.

VoraussetzungenPrerequisites

Erstellen der VerzeichnisstrukturCreate the directory structure

  1. Navigieren Sie zum Azure-Portal.Browse to the Azure portal.

  2. Öffnen Sie Azure Cloud Shell.Open Azure Cloud Shell. Falls Sie zuvor noch keine Umgebung ausgewählt haben, wählen Sie Bash als Umgebung aus.If you didn't select an environment previously, select Bash as your environment.

    Cloud Shell-Eingabeaufforderung

  3. Wechseln Sie in das Verzeichnis clouddrive.Change directories to the clouddrive directory.

    cd clouddrive
    
  4. Erstellen Sie ein Verzeichnis namens vmss.Create a directory named vmss.

    mkdir vmss
    
  5. Wechseln Sie zum neuen Verzeichnis:Change directories to the new directory:

    cd vmss
    

Erstellen der VariablendefinitionsdateiCreate the variables definitions file

In diesem Abschnitt definieren Sie die Variablen zur Anpassung der durch Terraform erstellten Ressourcen.In this section, you define the variables that customize the resources created by Terraform.

Führen Sie in der Azure Cloud Shell-Instanz die folgenden Schritte aus:Within the Azure Cloud Shell, do the following steps:

  1. Erstellen Sie eine Datei mit dem Namen variables.tf.Create a file named variables.tf.

    code variables.tf
    
  2. Fügen Sie den folgenden Code in den Editor ein: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. Speichern Sie die Datei ( <STRG+S), und beenden Sie den Editor ( <STRG+Q).Save the file (<Ctrl>S) and exit the editor (<Ctrl>Q).

Erstellen der AusgabedefinitionsdateiCreate the output definitions file

In diesem Abschnitt erstellen Sie die Datei, die die Ausgabe nach der Bereitstellung definiert.In this section, you create the file that describes the output after deployment.

Führen Sie in der Azure Cloud Shell-Instanz die folgenden Schritte aus:Within the Azure Cloud Shell, do the following steps:

  1. Erstellen Sie eine Datei mit dem Namen output.tf.Create a file named output.tf.

    code output.tf
    
  2. Fügen Sie den folgenden Code in den Editor ein, um den vollqualifizierten Domänennamen (FQDN) für die virtuellen Computer verfügbar zu machen.Paste the following code into the editor to expose the fully qualified domain name (FQDN) for the virtual machines. decodiert werden::

     output "vmss_public_ip" {
         value = azurerm_public_ip.vmss.fqdn
     }
    
  3. Speichern Sie die Datei ( <STRG+S), und beenden Sie den Editor ( <STRG+Q).Save the file (<Ctrl>S) and exit the editor (<Ctrl>Q).

Definieren der Netzwerkinfrastruktur in einer VorlageDefine the network infrastructure in a template

In diesem Abschnitt erstellen Sie in einer neuen Azure-Ressourcengruppe die folgende Netzwerkinfrastruktur:In this section, you create the following network infrastructure in a new Azure resource group:

  • Ein virtuelles Netzwerk (VNET) mit dem Adressraum 10.0.0.0/16One virtual network (VNET) with the address space of 10.0.0.0/16
  • Ein Subnetz mit dem Adressraum 10.0.2.0/24One subnet with the address space of 10.0.2.0/24
  • Zwei öffentliche IP-Adressen:Two public IP addresses. eine für den Lastenausgleich der VM-Skalierungsgruppe, eine für die Verbindungsherstellung mit der SSH-JumpboxOne used by the virtual machine scale set load balancer, the other used to connect to the SSH jumpbox.

Führen Sie in der Azure Cloud Shell-Instanz die folgenden Schritte aus:Within the Azure Cloud Shell, do the following steps:

  1. Erstellen Sie eine Datei mit dem Namen vmss.tf zur Beschreibung der Infrastruktur der VM-Skalierungsgruppe.Create a file named vmss.tf to describe the virtual machine scale set infrastructure.

    code vmss.tf
    
  2. Fügen Sie den folgenden Code am Ende der Datei ein, um den vollqualifizierten Domänennamen (FQDN) für die virtuellen Computer verfügbar zu machen.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. Speichern Sie die Datei ( <STRG+S), und beenden Sie den Editor ( <STRG+Q).Save the file (<Ctrl>S) and exit the editor (<Ctrl>Q).

Bereitstellen der NetzwerkinfrastrukturProvision the network infrastructure

Führen Sie unter Verwendung der Azure Cloud Shell-Instanz in dem Verzeichnis, in dem Sie die Konfigurationsdateien (TF-Dateien) erstellt haben, die folgenden Schritte aus:Using the Azure Cloud Shell from the directory where you created the configuration files (.tf) do the following steps:

  1. Initialisieren Sie Terraform.Initialize Terraform.

    terraform init
    
  2. Führen Sie den folgenden Befehl aus, um die definierte Infrastruktur in Azure bereitzustellen.Run the following command to deploy the defined infrastructure in Azure.

    terraform apply
    

    Terraform fordert Sie zur Eingabe eines Werts vom Typ location auf, da die Variable location zwar in variables.tf definiert ist, aber nicht festgelegt wurde.Terraform prompts you for a location value as the location variable is defined in variables.tf, but it's never set. Sie können also einen beliebigen gültigen Speicherort – z.B. „USA, Westen“ eingeben und dann die EINGABETASTE drücken.You can enter any valid location - such as "West US" followed by selecting Enter. (Bei allen Werten mit Leerzeichen sind Klammern zu verwenden.)(Use parentheses around any value with spaces.)

  3. Terraform gibt die Daten aus, wie sie in der output.tf-Datei definiert sind.Terraform prints the output as defined in the output.tf file. Der folgende Screenshot zeigt das Format des FQDN: <ID>.<location>.cloudapp.azure.com.As shown in the following screenshot, the FQDN takes the following form: <ID>.<location>.cloudapp.azure.com. Die ID ist ein berechneter Wert, und der Standort entspricht dem Wert, der beim Ausführen von Terraform angegeben wurde.The ID is a computed value and location is the value provide when running Terraform.

    VM-Skalierungsgruppe: vollqualifizierter Domänenname für die öffentliche IP-Adresse

  4. Wählen Sie im Hauptmenü des Azure-Portals Ressourcengruppen aus.In the Azure portal menu, select Resource groups from the main menu.

  5. Wählen Sie auf der Registerkarte Ressourcengruppen myResourceGroup aus, damit die von Terraform erstellten Ressourcen angezeigt werden.On the Resource groups tab, select myResourceGroup to view the resources that were created by Terraform. Netzwerkressourcen der VM-SkalierungsgruppeVirtual machine scale set network resources

Hinzufügen einer VM-SkalierungsgruppeAdd a virtual machine scale set

In diesem Abschnitt erfahren Sie, wie sich der Vorlage die folgenden Ressourcen hinzufügen lassen:In this section, you learn how to add the following resources to the template:

  • Einen Azure-Lastenausgleich und Regeln, um die Anwendung zu versorgen und an die öffentliche IP-Adresse anzufügen, deren Konfiguration oben im Artikel beschrieben wurdeAn Azure load balancer and rules to serve the application and attach it to the public IP address configured earlier in this article
  • Einen Azure-Back-End-Adresspool, der dem Lastenausgleich zugewiesen werden mussAn Azure backend address pool and assign it to the load balancer
  • Einen Integritätstestport, der von der Anwendung verwendet und für den Lastenausgleich konfiguriert wirdA health probe port used by the application and configured on the load balancer
  • Eine VM-Skalierungsgruppe, die sich hinter dem Lastenausgleich befindet und in dem VNET ausgeführt wird, dessen Bereitstellung oben im Artikel beschrieben wurdeA virtual machine scale set sitting behind the load balancer that runs on the VNET deployed earlier in this article
  • Nginx auf den Knoten der VM-Skalierungsgruppe mit Cloud-InitNginx on the nodes of the virtual machine scale using cloud-init.

Führen Sie in Cloud Shell die folgenden Schritte aus:In Cloud Shell, do the following steps:

  1. Öffnen Sie die vmss.tf-Konfigurationsdatei.Open the vmss.tf configuration file.

    code vmss.tf
    
  2. Gehen Sie ans Ende der Datei und drücken Sie die A-TASTE, um den Anfügemodus zu starten.Go to the end of the file and enter append mode by selecting the A key.

  3. Fügen Sie am Ende der Datei den folgenden Code hinzu: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. Speichern Sie die Datei, und geben Sie den folgenden Befehl ein, um den vi-Editor zu schließen:Save the file and exit the vi editor by entering the following command:

    :wq
    
  5. Erstellen Sie eine Datei mit dem Namen web.conf. Sie dient als Cloud-Init-Konfiguration für die virtuellen Computer, die zur Skalierungsgruppe gehören.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. Fügen Sie den folgenden Code in den Editor ein:Paste the following code into the editor:

    #cloud-config
    packages:
     - nginx
    
  7. Speichern Sie die Datei, und geben Sie den folgenden Befehl ein, um den vi-Editor zu schließen:Save the file and exit the vi editor by entering the following command:

    :wq
    
  8. Öffnen Sie die variables.tf-Konfigurationsdatei.Open the variables.tf configuration file.

    code variables.tf
    
  9. Gehen Sie ans Ende der Datei und drücken Sie die A-TASTE, um den Anfügemodus zu starten.Go to the end of the file and enter append mode by selecting the A key.

  10. Passen Sie die Bereitstellung an, indem Sie am Ende der Datei den folgenden Code einfügen: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. Speichern Sie die Datei ( <STRG+S), und beenden Sie den Editor ( <STRG+Q).Save the file (<Ctrl>S) and exit the editor (<Ctrl>Q).

  12. Erstellen Sie einen Terraform-Plan, um die Bereitstellung der VM-Skalierungsgruppe zu visualisieren.Create a Terraform plan to visualize the virtual machine scale set deployment. (Hierbei ist die Angabe eines Kennworts Ihrer Wahl und eines Speicherorts für Ihre Ressourcen erforderlich.)(You need to specify a password of your choosing, as well as the location for your resources.)

    terraform plan
    

    Die Ausgabe des Befehls sollte ungefähr so wie auf dem folgenden Screenshot aussehen:The output of the command should be similar to the following screenshot:

    Ausgabe des Erstellens der VM-Skalierungsgruppe

  13. Stellen Sie die neuen Ressourcen in Azure bereit.Deploy the new resources in Azure.

    terraform apply
    

    Die Ausgabe des Befehls sollte ungefähr so wie auf dem folgenden Screenshot aussehen:The output of the command should be similar to the following screenshot:

    Terraform-Ressourcengruppe für VM-Skalierungsgruppe

  14. Öffnen Sie einen Browser, und stellen Sie eine Verbindung mit dem FQDN her, der durch den Befehl zurückgegeben wurde.Open a browser and connect to the FQDN that was returned by the command.

    Ergebnisse des Navigierens zum FQDN

Hinzufügen einer SSH-JumpboxAdd an SSH jumpbox

Bei einer SSH-Jumpbox handelt es sich um einen Einzelserver, durch den Sie sozusagen „springen“, um auf andere Server im Netzwerk zuzugreifen.An SSH jumpbox is a single server that you "jump" through to access other servers on the network. In diesem Schritt konfigurieren Sie die folgenden Ressourcen:In this step, you configure the following resources:

  • Eine Netzwerkschnittstelle (oder Jumpbox), die mit dem gleichen Subnetz verbunden ist wie die VM-SkalierungsgruppeA network interface (or jumpbox) connected to the same subnet as the virtual machine scale set.

  • Einen virtuellen Computer, der mit dieser Netzwerkschnittstelle verbunden ist.A virtual machine connected with this network interface. Auf diese Jumpbox kann remote zugegriffen werden.This 'jumpbox' is remotely accessible. Nach der Verbindungsherstellung können Sie eine SSH-Verbindung mit einem beliebigen virtuellen Computer in der Skalierungsgruppe herstellen.Once connected, you can SSH to any of the virtual machines in the scale set.

  1. Öffnen Sie die vmss.tf-Konfigurationsdatei.Open the vmss.tf configuration file.

    code vmss.tf
    
  2. Gehen Sie ans Ende der Datei und drücken Sie die A-TASTE, um den Anfügemodus zu starten.Go to the end of the file and enter append mode by selecting the A key.

  3. Fügen Sie am Ende der Datei den folgenden Code hinzu: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. Öffnen Sie die output.tf-Konfigurationsdatei.Open the output.tf configuration file.

    code output.tf
    
  5. Gehen Sie ans Ende der Datei und drücken Sie die A-TASTE, um den Anfügemodus zu starten.Go to the end of the file and enter append mode by selecting the A key.

  6. Fügen Sie am Ende der Datei den folgenden Code hinzu, um nach Abschluss der Bereitstellung den Hostnamen der Jumpbox anzuzeigen: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. Speichern Sie die Datei ( <STRG+S), und beenden Sie den Editor ( <STRG+Q).Save the file (<Ctrl>S) and exit the editor (<Ctrl>Q).

  8. Stellen Sie die Jumpbox bereit.Deploy the jumpbox.

    terraform apply
    

Nach Abschluss der Bereitstellung sieht der Inhalt der Ressourcengruppe wie derjenige auf dem folgenden Screenshot aus:Once the deployment has completed, the content of the resource group resembles that shown in the following screenshot:

Terraform-Ressourcengruppe für VM-Skalierungsgruppe

Hinweis

Die Anmeldung mit einem Kennwort ist für die bereitgestellte Jumpbox und für die bereitgestellte VM-Skalierungsgruppe deaktiviert.The ability to log in with a password is disabled on the jumpbox and the virtual machine scale set that you deployed. Melden Sie sich mit SSH an, um auf die virtuellen Computer zuzugreifen.Log in with SSH to access the virtual machine(s).

Bereinigen der UmgebungEnvironment cleanup

Wenn Sie die in diesem Tutorial erstellten Terraform-Ressourcen löschen möchten, geben Sie in Cloud Shell den folgenden Befehl ein:To delete the Terraform resources that were created in this tutorial, enter the following command into Cloud Shell:

terraform destroy

Die Bereinigung kann einige Minuten dauern.The destruction process can take several minutes to complete.

Nächste SchritteNext steps