Delen via


Quickstart: Create a Linux VM cluster in Azure using Terraform

Van toepassing op: ✔️ Virtuele Linux-machines

This article shows you how to create a Linux VM cluster (containing two Linux VM instances) in Azure using Terraform.

In dit artikel leert u het volgende:

Vereiste voorwaarden

De Terraform-code implementeren

Opmerking

De voorbeeldcode voor dit artikel bevindt zich in de Azure Terraform GitHub-opslagplaats. U kunt het logboekbestand met de testresultaten van de huidige en vorige versies van Terraform bekijken.

Zie meer artikelen en voorbeeldcode waarin wordt getoond hoe u Terraform gebruikt om Azure-resources te beheren

  1. Maak een map aan om de voorbeeldcode van Terraform te testen en stel deze in als de huidige map.

  2. Maak een bestand met de naam providers.tf en voeg de volgende code in:

    terraform {
      required_version = ">=1.0"
      required_providers {
        azapi = {
          source  = "azure/azapi"
          version = "~>1.5"
        }
        azurerm = {
          source  = "hashicorp/azurerm"
          version = "~>3.0"
        }
        random = {
          source  = "hashicorp/random"
          version = "~>3.0"
        }
      }
    }
    provider "azurerm" {
      features {}
    }
    
  3. Maak een bestand met de naam ssh.tf en voeg de volgende code in:

    resource "random_pet" "ssh_key_name" {
      prefix    = "ssh"
      separator = ""
    }
    
    resource "azapi_resource_action" "ssh_public_key_gen" {
      type        = "Microsoft.Compute/sshPublicKeys@2022-11-01"
      resource_id = azapi_resource.ssh_public_key.id
      action      = "generateKeyPair"
      method      = "POST"
    
      response_export_values = ["publicKey", "privateKey"]
    }
    
    resource "azapi_resource" "ssh_public_key" {
      type      = "Microsoft.Compute/sshPublicKeys@2022-11-01"
      name      = random_pet.ssh_key_name.id
      location  = azurerm_resource_group.rg.location
      parent_id = azurerm_resource_group.rg.id
    }
    
    output "key_data" {
      value = azapi_resource_action.ssh_public_key_gen.output.publicKey
    }
    
  4. Maak een bestand met de naam main.tf en voeg de volgende code in:

    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
    }
    
    resource "random_pet" "azurerm_virtual_network_name" {
      prefix = "vnet"
    }
    
    resource "azurerm_virtual_network" "test" {
      name                = random_pet.azurerm_virtual_network_name.id
      address_space       = ["10.0.0.0/16"]
      location            = azurerm_resource_group.rg.location
      resource_group_name = azurerm_resource_group.rg.name
    }
    
    resource "random_pet" "azurerm_subnet_name" {
      prefix = "sub"
    }
    
    resource "azurerm_subnet" "test" {
      name                 = random_pet.azurerm_subnet_name.id
      resource_group_name  = azurerm_resource_group.rg.name
      virtual_network_name = azurerm_virtual_network.test.name
      address_prefixes     = ["10.0.2.0/24"]
    }
    
    resource "azurerm_public_ip" "test" {
      name                = "publicIPForLB"
      location            = azurerm_resource_group.rg.location
      resource_group_name = azurerm_resource_group.rg.name
      allocation_method   = "Static"
    }
    
    resource "azurerm_lb" "test" {
      name                = "loadBalancer"
      location            = azurerm_resource_group.rg.location
      resource_group_name = azurerm_resource_group.rg.name
    
      frontend_ip_configuration {
        name                 = "publicIPAddress"
        public_ip_address_id = azurerm_public_ip.test.id
      }
    }
    
    resource "azurerm_lb_backend_address_pool" "test" {
      loadbalancer_id = azurerm_lb.test.id
      name            = "BackEndAddressPool"
    }
    
    resource "azurerm_network_interface" "test" {
      count               = 2
      name                = "acctni${count.index}"
      location            = azurerm_resource_group.rg.location
      resource_group_name = azurerm_resource_group.rg.name
    
      ip_configuration {
        name                          = "testConfiguration"
        subnet_id                     = azurerm_subnet.test.id
        private_ip_address_allocation = "Dynamic"
      }
    }
    
    resource "azurerm_availability_set" "avset" {
      name                         = "avset"
      location                     = azurerm_resource_group.rg.location
      resource_group_name          = azurerm_resource_group.rg.name
      platform_fault_domain_count  = 2
      platform_update_domain_count = 2
      managed                      = true
    }
    
    resource "random_pet" "azurerm_linux_virtual_machine_name" {
      prefix = "vm"
    }
    
    resource "azurerm_linux_virtual_machine" "test" {
      count                 = 2
      name                  = "${random_pet.azurerm_linux_virtual_machine_name.id}${count.index}"
      location              = azurerm_resource_group.rg.location
      availability_set_id   = azurerm_availability_set.avset.id
      resource_group_name   = azurerm_resource_group.rg.name
      network_interface_ids = [azurerm_network_interface.test[count.index].id]
      size                  = "Standard_DS1_v2"
    
      # Uncomment this line to delete the OS disk automatically when deleting the VM
      # delete_os_disk_on_termination = true
    
      # Uncomment this line to delete the data disks automatically when deleting the VM
      # delete_data_disks_on_termination = true
    
      source_image_reference {
        publisher = "Canonical"
        offer     = "UbuntuServer"
        sku       = "16.04-LTS"
        version   = "latest"
      }
    
      admin_ssh_key {
        username   = var.username
        public_key = azapi_resource_action.ssh_public_key_gen.output.publicKey
      }
    
      os_disk {
        caching              = "ReadWrite"
        storage_account_type = "Standard_LRS"
        name                 = "myosdisk${count.index}"
      }
    
      computer_name  = "hostname"
      admin_username = var.username
    }
    
    resource "azurerm_managed_disk" "test" {
      count                = 2
      name                 = "datadisk_existing_${count.index}"
      location             = azurerm_resource_group.rg.location
      resource_group_name  = azurerm_resource_group.rg.name
      storage_account_type = "Standard_LRS"
      create_option        = "Empty"
      disk_size_gb         = "1024"
    }
    
    resource "azurerm_virtual_machine_data_disk_attachment" "test" {
      count              = 2
      managed_disk_id    = azurerm_managed_disk.test[count.index].id
      virtual_machine_id = azurerm_linux_virtual_machine.test[count.index].id
      lun                = "10"
      caching            = "ReadWrite"
    }
    
  5. Maak een bestand met de naam variables.tf en voeg de volgende code in:

    variable "resource_group_location" {
      type        = string
      description = "Location for all resources."
      default     = "eastus"
    }
    
    variable "resource_group_name_prefix" {
      type        = string
      description = "Prefix of the resource group name that's combined with a random ID so name is unique in your Azure subscription."
      default     = "rg"
    }
    
    variable "username" {
      type        = string
      description = "The username for the local account that will be created on the new VM."
      default     = "azureadmin"
    }
    
  6. Maak een bestand met de naam outputs.tf en voeg de volgende code in:

    output "resource_group_name" {
      value = azurerm_resource_group.rg.name
    }
    
    output "virtual_network_name" {
      value = azurerm_virtual_network.test.name
    }
    
    output "subnet_name" {
      value = azurerm_subnet.test.name
    }
    
    output "linux_virtual_machine_names" {
      value = [for s in azurerm_linux_virtual_machine.test : s.name[*]]
    }
    

Terraform initialiseren

Voer terraform init uit om de Terraform-implementatie te initialiseren. Met deze opdracht wordt de Azure-provider gedownload die is vereist voor het beheren van uw Azure-resources.

terraform init -upgrade

Belangrijkste punten:

  • Met -upgrade de parameter worden de benodigde providerinvoegtoepassingen bijgewerkt naar de nieuwste versie die voldoet aan de versiebeperkingen van de configuratie.

Een Terraform-uitvoeringsplan maken

Voer terraform-plan uit om een uitvoeringsplan te maken.

terraform plan -out main.tfplan

Belangrijkste punten:

  • De terraform plan opdracht maakt een uitvoeringsplan, maar voert het niet uit. In plaats daarvan wordt bepaald welke acties nodig zijn om de configuratie te maken die is opgegeven in uw configuratiebestanden. Met dit patroon kunt u controleren of het uitvoeringsplan aan uw verwachtingen voldoet voordat u wijzigingen aanbrengt in de werkelijke resources.
  • Met de optionele -out parameter kunt u een uitvoerbestand voor het plan opgeven. Door de -out parameter te gebruiken, zorgt u ervoor dat het plan dat u hebt gecontroleerd precies wordt toegepast.

Een Terraform-uitvoeringsplan toepassen

Voer terraform apply uit om het uitvoeringsplan toe te passen op uw cloudinfrastructuur.

terraform apply main.tfplan

Belangrijkste punten:

  • In het voorbeeld terraform apply opdracht wordt ervan uitgegaan dat u eerder terraform plan -out main.tfplanhebt uitgevoerd.
  • Als u een andere bestandsnaam voor de -out parameter hebt opgegeven, gebruikt u diezelfde bestandsnaam in de aanroep naar terraform apply.
  • Als u de -out-parameter niet hebt gebruikt, roep terraform apply dan zonder parameters aan.

Kostengegevens worden niet weergegeven tijdens het proces voor het maken van virtuele machines voor Terraform, net als voor Azure Portal. Als u meer wilt weten over de werking van kosten voor virtuele machines, raadpleegt u de pagina Overzicht van kostenoptimalisatie.

De resultaten controleren

  1. Haal de naam van de Azure-resourcegroep op.

    resource_group_name=$(terraform output -raw resource_group_name)
    
  2. Run az vm list with a JMESPath query to display the names of the virtual machines created in the resource group.

    az vm list \
      --resource-group $resource_group_name \
      --query "[].{\"VM Name\":name}" -o table
    

De hulpbronnen opschonen

Voer de volgende stappen uit wanneer u de resources die zijn gemaakt via Terraform niet meer nodig hebt:

  1. Voer terraform-plan uit en geef de destroy vlag op.

    terraform plan -destroy -out main.destroy.tfplan
    

    Belangrijkste punten:

    • De terraform plan opdracht maakt een uitvoeringsplan, maar voert het niet uit. In plaats daarvan wordt bepaald welke acties nodig zijn om de configuratie te maken die is opgegeven in uw configuratiebestanden. Met dit patroon kunt u controleren of het uitvoeringsplan aan uw verwachtingen voldoet voordat u wijzigingen aanbrengt in de werkelijke resources.
    • Met de optionele -out parameter kunt u een uitvoerbestand voor het plan opgeven. Door de -out parameter te gebruiken, zorgt u ervoor dat het plan dat u hebt gecontroleerd precies wordt toegepast.
  2. Voer terraform apply uit om het uitvoeringsplan toe te passen.

    terraform apply main.destroy.tfplan
    

Problemen met Terraform in Azure oplossen

Veelvoorkomende problemen oplossen bij het gebruik van Terraform in Azure

Volgende stappen