Schnellstart: Konfigurieren eines virtuellen Linux-Computers in Azure mithilfe von Terraform

Artikel, der mit den folgenden Terraform- und Terraform-Anbieterversionen getestet wurde:

Mit Terraform können Sie eine Cloudinfrastruktur definieren, eine Vorschau der Cloudinfrastruktur anzeigen und die Cloudinfrastruktur bereitstellen. Terraform ermöglicht das Erstellen von Konfigurationsdateien mit HCL-Syntax. Mit der HCL-Syntax können Sie den Cloudanbieter (beispielsweise Azure) und die Elemente angeben, aus denen sich Ihre Cloudinfrastruktur zusammensetzt. Nach der Erstellung Ihrer Konfigurationsdateien erstellen Sie einen Ausführungsplan, mit dem Sie eine Vorschau Ihrer Infrastrukturänderungen anzeigen können, bevor diese bereitgestellt werden. Nach der Überprüfung der Änderungen wenden Sie den Ausführungsplan an, um die Infrastruktur bereitzustellen. Weitere Informationen zur Verwendung von Terraform in Azure finden Sie im Azure Terraform Developer Center

In diesem Artikel wird gezeigt, wie Sie eine vollständige Linux-Umgebung und die unterstützenden Ressourcen mit Terraform erstellen. Zu diesen Ressourcen gehören ein virtuelles Netzwerk, ein Subnetz, eine öffentliche IP-Adresse und vieles mehr.

In diesem Artikel werden folgende Vorgehensweisen behandelt:

  • Erstellen eines virtuellen Netzwerks
  • Erstellen eines Subnetzes
  • Erstellen einer öffentlichen IP-Adresse
  • Erstellen einer Netzwerksicherheitsgruppe und ssh-eingehender Regel
  • Erstellen einer virtuellen Netzwerkadapterkarte
  • Verbinden der Netzwerksicherheitsgruppe an die Netzwerkschnittstelle
  • Erstellen eines Speicherkontos für die Startdiagnose
  • SSH-Schlüssel erstellen
  • Erstellen eines virtuellen Computers
  • Verwenden von SSH zum Herstellen einer Verbindung mit dem virtuellen Computer

Voraussetzungen

  • Azure-Abonnement: Wenn Sie kein Azure-Abonnement besitzen, können Sie ein kostenloses Konto erstellen, bevor Sie beginnen.

Implementieren des Terraform-Codes

  1. Erstellen Sie ein Verzeichnis, in dem der Terraform-Beispielcode getestet werden soll, und legen Sie es als aktuelles Verzeichnis fest.

  2. Erstellen Sie eine Datei namens providers.tf, und fügen Sie den folgenden Code ein:

    terraform {
    
      required_version = ">=0.12"
    
      required_providers {
        azurerm = {
          source = "hashicorp/azurerm"
          version = "~>2.0"
        }
      }
    }
    
    provider "azurerm" {
      features {}
    }
    
  3. Erstellen Sie eine Datei namens main.tf, und fügen Sie den folgenden Code ein:

    resource "random_pet" "rg-name" {
      prefix    = var.resource_group_name_prefix
    }
    
    resource "azurerm_resource_group" "rg" {
      name      = random_pet.rg-name.id
      location  = var.resource_group_location
    }
    
    # Create virtual network
    resource "azurerm_virtual_network" "myterraformnetwork" {
      name                = "myVnet"
      address_space       = ["10.0.0.0/16"]
      location            = azurerm_resource_group.rg.location
      resource_group_name = azurerm_resource_group.rg.name
    }
    
    # Create subnet
    resource "azurerm_subnet" "myterraformsubnet" {
      name                 = "mySubnet"
      resource_group_name  = azurerm_resource_group.rg.name
      virtual_network_name = azurerm_virtual_network.myterraformnetwork.name
      address_prefixes     = ["10.0.1.0/24"]
    }
    
    # Create public IPs
    resource "azurerm_public_ip" "myterraformpublicip" {
      name                = "myPublicIP"
      location            = azurerm_resource_group.rg.location
      resource_group_name = azurerm_resource_group.rg.name
      allocation_method   = "Dynamic"
    }
    
    # Create Network Security Group and rule
    resource "azurerm_network_security_group" "myterraformnsg" {
      name                = "myNetworkSecurityGroup"
      location            = azurerm_resource_group.rg.location
      resource_group_name = azurerm_resource_group.rg.name
    
      security_rule {
        name                       = "SSH"
        priority                   = 1001
        direction                  = "Inbound"
        access                     = "Allow"
        protocol                   = "Tcp"
        source_port_range          = "*"
        destination_port_range     = "22"
        source_address_prefix      = "*"
        destination_address_prefix = "*"
      }
    }
    
    # Create network interface
    resource "azurerm_network_interface" "myterraformnic" {
      name                = "myNIC"
      location            = azurerm_resource_group.rg.location
      resource_group_name = azurerm_resource_group.rg.name
    
      ip_configuration {
        name                          = "myNicConfiguration"
        subnet_id                     = azurerm_subnet.myterraformsubnet.id
        private_ip_address_allocation = "Dynamic"
        public_ip_address_id          = azurerm_public_ip.myterraformpublicip.id
      }
    }
    
    # Connect the security group to the network interface
    resource "azurerm_network_interface_security_group_association" "example" {
      network_interface_id      = azurerm_network_interface.myterraformnic.id
      network_security_group_id = azurerm_network_security_group.myterraformnsg.id
    }
    
    # Generate random text for a unique storage account name
    resource "random_id" "randomId" {
      keepers = {
        # Generate a new ID only when a new resource group is defined
        resource_group = azurerm_resource_group.rg.name
      }
    
      byte_length = 8
    }
    
    # Create storage account for boot diagnostics
    resource "azurerm_storage_account" "mystorageaccount" {
      name                     = "diag${random_id.randomId.hex}"
      location                 = azurerm_resource_group.rg.location
      resource_group_name      = azurerm_resource_group.rg.name
      account_tier             = "Standard"
      account_replication_type = "LRS"
    }
    
    # Create (and display) an SSH key
    resource "tls_private_key" "example_ssh" {
      algorithm = "RSA"
      rsa_bits  = 4096
    }
    
    # Create virtual machine
    resource "azurerm_linux_virtual_machine" "myterraformvm" {
      name                  = "myVM"
      location              = azurerm_resource_group.rg.location
      resource_group_name   = azurerm_resource_group.rg.name
      network_interface_ids = [azurerm_network_interface.myterraformnic.id]
      size                  = "Standard_DS1_v2"
    
      os_disk {
        name                 = "myOsDisk"
        caching              = "ReadWrite"
        storage_account_type = "Premium_LRS"
      }
    
      source_image_reference {
        publisher = "Canonical"
        offer     = "UbuntuServer"
        sku       = "18.04-LTS"
        version   = "latest"
      }
    
      computer_name                   = "myvm"
      admin_username                  = "azureuser"
      disable_password_authentication = true
    
      admin_ssh_key {
        username   = "azureuser"
        public_key = tls_private_key.example_ssh.public_key_openssh
      }
    
      boot_diagnostics {
        storage_account_uri = azurerm_storage_account.mystorageaccount.primary_blob_endpoint
      }
    }
    
  4. Erstellen Sie eine Datei namens variables.tf, und fügen Sie den folgenden Code ein:

    variable "resource_group_name_prefix" {
      default       = "rg"
      description   = "Prefix of the resource group name that's combined with a random ID so name is unique in your Azure subscription."
    }
    
    variable "resource_group_location" {
      default       = "eastus"
      description   = "Location of the resource group."
    }
    
  5. Erstellen Sie eine Datei namens output.tf, und fügen Sie den folgenden Code ein:

    output "resource_group_name" {
      value = azurerm_resource_group.rg.name
    }
    
    output "public_ip_address" {
      value = azurerm_linux_virtual_machine.myterraformvm.public_ip_address
    }
    
    output "tls_private_key" {
      value     = tls_private_key.example_ssh.private_key_pem
      sensitive = true
    }
    

Initialisieren von Terraform

Führen Sie zum Initialisieren der Terraform-Bereitstellung terraform init aus. Dieser Befehl lädt die azure-Module herunter, die zum Verwalten Ihrer Azure-Ressourcen erforderlich sind.

terraform init

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.
  • Weitere Informationen zum Speichern von Ausführungsplänen und zur Sicherheit finden Sie im Abschnitt mit der Sicherheitswarnung.

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:

  • Beim obigen Befehl terraform apply wird davon ausgegangen, dass Sie zuvor terraform 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 von terraform apply.
  • Wenn Sie den Parameter -out nicht verwendet haben, rufen Sie terraform apply einfach ohne Parameter auf.

Überprüfen der Ergebnisse

Führen Sie die folgenden Schritte aus, um SSH zum Herstellen einer Verbindung mit dem virtuellen Computer zu verwenden:

  1. Führen Sie die Terraform-Ausgabe aus, um den privaten SSH-Schlüssel abzurufen und in einer Datei zu speichern.

    terraform output -raw tls_private_key > id_rsa
    
  2. Führen Sie die Terraform-Ausgabe aus, um die öffentliche IP-Adresse des virtuellen Computers abzurufen.

    terraform output public_ip_address
    
  3. Verwenden Sie SSH, um eine Verbindung mit dem virtuellen Computer herzustellen.

    ssh -i id_rsa azureuser@<public_ip_address>
    

Problembehandlung für Terraform in Azure

Behandeln allgemeiner Probleme bei der Verwendung von Terraform in Azure

Nächste Schritte