Schnellstart: Erstellen einer vollständigen Linux-VM-Infrastruktur in Azure mit TerraformQuickstart: Create a complete Linux virtual machine infrastructure in Azure with Terraform

Mit Terraform können Sie vollständige Infrastrukturbereitstellungen in Azure definieren und erstellen.Terraform allows you to define and create complete infrastructure deployments in Azure. Dazu lassen sich Terraform-Vorlagen in einem für Menschen lesbaren Format erstellen, die Azure-Ressourcen konsistent und reproduzierbar erstellen und konfigurieren.You build Terraform templates in a human-readable format that create and configure Azure resources in a consistent, reproducible manner. In diesem Artikel wird gezeigt, wie Sie eine vollständige Linux-Umgebung und die unterstützenden Ressourcen mit Terraform erstellen.This article shows you how to create a complete Linux environment and supporting resources with Terraform. Hier erfahren Sie auch, wie Sie Terraform installieren und konfigurieren.You can also learn how to install and configure Terraform.

Hinweis

Wenn Sie Terraform-spezifische Unterstützung benötigen, wenden Sie sich über einen der Community-Kanäle direkt an Terraform:For Terraform specific support, please reach out to Terraform directly using one of their community channels:

  • Der Terraform-Abschnitt des Community-Portals enthält Fragen, Anwendungsfälle und nützliche Muster.The Terraform section of the community portal contains questions, use cases, and useful patterns.

  • Informationen zu anbieterbezogenen Fragen finden Sie im Abschnitt Terraform-Anbieter im Community-Portal.For provider-related questions please visit the Terraform Providers section of the community portal.

Erstellen einer Azure-Verbindung und -RessourcengruppeCreate Azure connection and resource group

Lassen Sie uns alle Abschnitte einer Terraform-Vorlage durchgehen.Let's go through each section of a Terraform template. Sie können auch die Vollversion der Terraform-Vorlage sehen, die Sie kopieren und einfügen können.You can also see the full version of the Terraform template that you can copy and paste.

Der provider-Abschnitt weist Terraform an, einen Azure-Anbieter zu verwenden.The provider section tells Terraform to use an Azure provider. Informationen zum Abrufen der Werte für subscription_id, client_id, client_secret und tenant_id finden Sie unter Installieren und Konfigurieren von Terraform.To get values for subscription_id, client_id, client_secret, and tenant_id, see Install and configure Terraform.

Tipp

Wenn Sie Umgebungsvariablen für die Werte erstellen oder die Azure Cloud Shell Bash-Funktionalität verwenden, müssen Sie die Variablendeklarationen in diesem Abschnitt nicht einbeziehen.If you create environment variables for the values or are using the Azure Cloud Shell Bash experience , you don't need to include the variable declarations in this section.

provider "azurerm" {
    # The "feature" block is required for AzureRM provider 2.x. 
    # If you're using version 1.x, the "features" block is not allowed.
    version = "~>2.0"
    features {}
    
    subscription_id = "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
    client_id       = "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
    client_secret   = "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
    tenant_id       = "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}

Der folgende Abschnitt erstellt eine Ressourcengruppe namens myResourceGroup am Standort eastus:The following section creates a resource group named myResourceGroup in the eastus location:

resource "azurerm_resource_group" "myterraformgroup" {
    name     = "myResourceGroup"
    location = "eastus"

    tags = {
        environment = "Terraform Demo"
    }
}

In allen weiteren Abschnitten verweisen Sie mit ${azurerm_resource_group.myterraformgroup.name} auf die Ressourcengruppe.In additional sections, you reference the resource group with ${azurerm_resource_group.myterraformgroup.name}.

Virtuelles Netzwerk erstellenCreate virtual network

Im folgenden Abschnitt wird ein virtuelles Netzwerk namens myVnet im Adressbereich 10.0.0.0/16 erstellt:The following section creates a virtual network named myVnet in the 10.0.0.0/16 address space:

resource "azurerm_virtual_network" "myterraformnetwork" {
    name                = "myVnet"
    address_space       = ["10.0.0.0/16"]
    location            = "eastus"
    resource_group_name = azurerm_resource_group.myterraformgroup.name

    tags = {
        environment = "Terraform Demo"
    }
}

Im folgenden Abschnitt wird das Subnetz mySubnet im virtuellen Netzwerk myVnet erstellt:The following section creates a subnet named mySubnet in the myVnet virtual network:

resource "azurerm_subnet" "myterraformsubnet" {
    name                 = "mySubnet"
    resource_group_name  = azurerm_resource_group.myterraformgroup.name
    virtual_network_name = azurerm_virtual_network.myterraformnetwork.name
    address_prefix       = "10.0.2.0/24"
}

Erstellen einer öffentlichen IP-AdresseCreate public IP address

Für den Zugriff auf Ressourcen über das Internet erstellen Sie eine öffentliche IP-Adresse für Ihren virtuellen Computer und weisen sie zu.To access resources across the Internet, create and assign a public IP address to your VM. Im folgenden Abschnitt wird eine öffentliche IP-Adresse namens myPublicIP erstellt:The following section creates a public IP address named myPublicIP:

resource "azurerm_public_ip" "myterraformpublicip" {
    name                         = "myPublicIP"
    location                     = "eastus"
    resource_group_name          = azurerm_resource_group.myterraformgroup.name
    allocation_method            = "Dynamic"

    tags = {
        environment = "Terraform Demo"
    }
}

Erstellen einer NetzwerksicherheitsgruppeCreate Network Security Group

Netzwerksicherheitsgruppen steuern den ein- und ausgehenden Netzwerkdatenverkehr des virtuellen Computers.Network Security Groups control the flow of network traffic in and out of your VM. Im folgenden Abschnitt wird eine Netzwerksicherheitsgruppe mit dem Namen myNetworkSecurityGrouperstellt und eine Regel zum Zulassen von SSH-Datenverkehr über den TCP-Port 22 definiert:The following section creates a network security group named myNetworkSecurityGroup and defines a rule to allow SSH traffic on TCP port 22:

resource "azurerm_network_security_group" "myterraformnsg" {
    name                = "myNetworkSecurityGroup"
    location            = "eastus"
    resource_group_name = azurerm_resource_group.myterraformgroup.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 = "*"
    }

    tags = {
        environment = "Terraform Demo"
    }
}

Erstellen virtueller NetzwerkschnittstellenkartenCreate virtual network interface card

Eine virtuelle Netzwerkschnittstellenkarte (NIC) verbindet Ihren virtuellen Computer mit einem angegebenen virtuellen Netzwerk, einer öffentlichen IP-Adresse und einer Netzwerksicherheitsgruppe.A virtual network interface card (NIC) connects your VM to a given virtual network, public IP address, and network security group. Im folgenden Abschnitt einer Terraform-Vorlage wird die virtuelle Netzwerkkarte myNIC erstellt, die mit den erstellten virtuellen Netzwerkressourcen verbunden ist:The following section in a Terraform template creates a virtual NIC named myNIC connected to the virtual networking resources you've created:

resource "azurerm_network_interface" "myterraformnic" {
    name                        = "myNIC"
    location                    = "eastus"
    resource_group_name         = azurerm_resource_group.myterraformgroup.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}"
    }

    tags = {
        environment = "Terraform Demo"
    }
}

# 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
}

Erstellen eines Speicherkontos für DiagnosezweckeCreate storage account for diagnostics

Um die Startdiagnose für eine VM zu speichern, benötigen Sie ein Speicherkonto.To store boot diagnostics for a VM, you need a storage account. Diese Startdiagnose kann Sie bei der Problembehandlung und Überwachung des Status Ihrer VM unterstützen.These boot diagnostics can help you troubleshoot problems and monitor the status of your VM. Das Speicherkonto, dass Sie erstellen, dient nur der Speicherung der Startdiagnosedaten.The storage account you create is only to store the boot diagnostics data. Da jedes Speicherkonto einen eindeutigen Namen haben muss, wird im nächsten Abschnitt zufälliger Text erzeugt:As each storage account must have a unique name, the following section generates some random text:

resource "random_id" "randomId" {
    keepers = {
        # Generate a new ID only when a new resource group is defined
        resource_group = azurerm_resource_group.myterraformgroup.name
    }
    
    byte_length = 8
}

Nun können Sie ein Speicherkonto erstellen.Now you can create a storage account. Im folgenden Abschnitt wird ein Speicherkonto erstellt, dessen Name auf dem im vorherigen Schritt generierten zufälligen Text basiert:The following section creates a storage account, with the name based on the random text generated in the preceding step:

resource "azurerm_storage_account" "mystorageaccount" {
    name                        = "diag${random_id.randomId.hex}"
    resource_group_name         = azurerm_resource_group.myterraformgroup.name
    location                    = "eastus"
    account_replication_type    = "LRS"
    account_tier                = "Standard"

    tags = {
        environment = "Terraform Demo"
    }
}

Erstellen eines virtuellen ComputersCreate virtual machine

Der letzte Schritt besteht im Erstellen eines virtuellen Computers und dem Verwenden der erstellten Ressourcen.The final step is to create a VM and use all the resources created. Im folgenden Abschnitt wird eine VM namens myVM erstellt und die virtuelle NIC myNIC angefügt.The following section creates a VM named myVM and attaches the virtual NIC named myNIC. Das neueste Ubuntu 16.04-LTS-Image wird verwendet, und ein Benutzer namens azureuser wird mit deaktivierter Kennwortauthentifizierung erstellt.The latest Ubuntu 16.04-LTS image is used, and a user named azureuser is created with password authentication disabled.

SSH-Schlüsseldaten finden Sie im Abschnitt ssh_keys.SSH key data is provided in the ssh_keys section. Geben Sie im Feld key_data einen öffentlichen SSH-Schlüssel an.Provide a public SSH key in the key_data field.

resource "azurerm_linux_virtual_machine" "myterraformvm" {
    name                  = "myVM"
    location              = "eastus"
    resource_group_name   = azurerm_resource_group.myterraformgroup.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       = "16.04.0-LTS"
        version   = "latest"
    }

    computer_name  = "myvm"
    admin_username = "azureuser"
    disable_password_authentication = true
        
    admin_ssh_key {
        username       = "azureuser"
        public_key     = file("/home/azureuser/.ssh/authorized_keys")
    }

    boot_diagnostics {
        storage_account_uri = azurerm_storage_account.mystorageaccount.primary_blob_endpoint
    }

    tags = {
        environment = "Terraform Demo"
    }
}

Vervollständigen des Terraform-SkriptsComplete Terraform script

Um alle diese Abschnitte zusammenzuführen und mit Terraform auszuführen, erstellen Sie eine Datei namens terraform_azure.tf, und fügen Sie den folgenden Inhalt ein:To bring all these sections together and see Terraform in action, create a file called terraform_azure.tf and paste the following content:

# Configure the Microsoft Azure Provider
provider "azurerm" {
    # The "feature" block is required for AzureRM provider 2.x. 
    # If you're using version 1.x, the "features" block is not allowed.
    version = "~>2.0"
    features {}

    subscription_id = "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
    client_id       = "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
    client_secret   = "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
    tenant_id       = "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}

# Create a resource group if it doesn't exist
resource "azurerm_resource_group" "myterraformgroup" {
    name     = "myResourceGroup"
    location = "eastus"

    tags = {
        environment = "Terraform Demo"
    }
}

# Create virtual network
resource "azurerm_virtual_network" "myterraformnetwork" {
    name                = "myVnet"
    address_space       = ["10.0.0.0/16"]
    location            = "eastus"
    resource_group_name = azurerm_resource_group.myterraformgroup.name

    tags = {
        environment = "Terraform Demo"
    }
}

# Create subnet
resource "azurerm_subnet" "myterraformsubnet" {
    name                 = "mySubnet"
    resource_group_name  = azurerm_resource_group.myterraformgroup.name
    virtual_network_name = azurerm_virtual_network.myterraformnetwork.name
    address_prefix       = "10.0.1.0/24"
}

# Create public IPs
resource "azurerm_public_ip" "myterraformpublicip" {
    name                         = "myPublicIP"
    location                     = "eastus"
    resource_group_name          = azurerm_resource_group.myterraformgroup.name
    allocation_method            = "Dynamic"

    tags = {
        environment = "Terraform Demo"
    }
}

# Create Network Security Group and rule
resource "azurerm_network_security_group" "myterraformnsg" {
    name                = "myNetworkSecurityGroup"
    location            = "eastus"
    resource_group_name = azurerm_resource_group.myterraformgroup.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 = "*"
    }

    tags = {
        environment = "Terraform Demo"
    }
}

# Create network interface
resource "azurerm_network_interface" "myterraformnic" {
    name                      = "myNIC"
    location                  = "eastus"
    resource_group_name       = azurerm_resource_group.myterraformgroup.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
    }

    tags = {
        environment = "Terraform Demo"
    }
}

# 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.myterraformgroup.name
    }
    
    byte_length = 8
}

# Create storage account for boot diagnostics
resource "azurerm_storage_account" "mystorageaccount" {
    name                        = "diag${random_id.randomId.hex}"
    resource_group_name         = azurerm_resource_group.myterraformgroup.name
    location                    = "eastus"
    account_tier                = "Standard"
    account_replication_type    = "LRS"

    tags = {
        environment = "Terraform Demo"
    }
}

# Create virtual machine
resource "azurerm_linux_virtual_machine" "myterraformvm" {
    name                  = "myVM"
    location              = "eastus"
    resource_group_name   = azurerm_resource_group.myterraformgroup.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       = "16.04.0-LTS"
        version   = "latest"
    }

    computer_name  = "myvm"
    admin_username = "azureuser"
    disable_password_authentication = true
        
    admin_ssh_key {
        username       = "azureuser"
        public_key     = file("/home/azureuser/.ssh/authorized_keys")
    }

    boot_diagnostics {
        storage_account_uri = azurerm_storage_account.mystorageaccount.primary_blob_endpoint
    }

    tags = {
        environment = "Terraform Demo"
    }
}

Erstellen und Bereitstellen der InfrastrukturBuild and deploy the infrastructure

Wenn die Terraform-Vorlage erstellt wurde, initialisieren Sie Terraform.With your Terraform template created, the first step is to initialize Terraform. Dadurch wird sichergestellt, dass Terraform über alle erforderlichen Komponenten zum Erstellen der Vorlage in Azure verfügt.This step ensures that Terraform has all the prerequisites to build your template in Azure.

terraform init

Lassen Sie die Vorlage als Nächstes von Terraform prüfen und validieren.The next step is to have Terraform review and validate the template. Bei diesem Schritt werden die erforderlichen Ressourcen mit den von Terraform gespeicherten Zustandsinformationen verglichen. Anschließend wird die geplante Ausführung ausgegeben.This step compares the requested resources to the state information saved by Terraform and then outputs the planned execution. Die Azure-Ressourcen werden zu diesem Zeitpunkt nicht erstellt.The Azure resources aren't created at this point.

terraform plan

Nach der Ausführung des vorherigen Befehls sollte etwa der folgende Bildschirm angezeigt werden:After you execute the previous command, you should see something like the following screen:

Refreshing Terraform state in-memory prior to plan...
The refreshed state will be used to calculate this plan, but will not be
persisted to local or remote state storage.


...

Note: You didn't specify an "-out" parameter to save this plan, so when
"apply" is called, Terraform can't guarantee this is what will execute.
  + azurerm_resource_group.myterraform
      <snip>
  + azurerm_virtual_network.myterraformnetwork
      <snip>
  + azurerm_network_interface.myterraformnic
      <snip>
  + azurerm_network_security_group.myterraformnsg
      <snip>
  + azurerm_public_ip.myterraformpublicip
      <snip>
  + azurerm_subnet.myterraformsubnet
      <snip>
  + azurerm_virtual_machine.myterraformvm
      <snip>
Plan: 7 to add, 0 to change, 0 to destroy.

Wenn alle Eingaben richtig und Sie für die Erstellung der Infrastruktur in Azure bereit sind, wenden Sie die Vorlage in Terraform an:If everything looks correct and you're ready to build the infrastructure in Azure, apply the template in Terraform:

terraform apply

Wenn Terraform den Vorgang abschließt, wurde die VM-Infrastruktur erstellt.Once Terraform completes, your VM infrastructure is ready. Sie können die öffentliche IP-Adresse Ihres virtuellen Computers mit dem Befehl az vm show abrufen:Obtain the public IP address of your VM with az vm show:

az vm show --resource-group myResourceGroup --name myVM -d --query [publicIps] --o tsv

Anschließend können Sie eine SSH-Verbindung mit dem virtuellen Computer herstellen:You can then SSH to your VM:

ssh azureuser@<publicIps>

Nächste SchritteNext steps