Een Azure VM-cluster maken met Terraform en HCL

In dit artikel ziet u hoe u een klein rekencluster maakt met behulp van HCL.

In dit artikel leert u het volgende:

  • Azure-verificatie instellen.
  • Maak een Terraform-configuratiebestand.
  • Gebruik een Terraform-configuratiebestand om een load balancer.
  • Gebruik een Terraform-configuratiebestand om twee virtuele Linux-VM's in een beschikbaarheidsset te implementeren.
  • Initialiseer Terraform.
  • Een Terraform-uitvoeringsplan maken.
  • Pas het Terraform-uitvoeringsplan toe om de Azure-resources te maken.

1. Uw omgeving configureren

  • Azure-abonnement: Als u nog geen abonnement op Azure hebt, maak dan een gratis account aan voordat u begint.

2. De code implementeren

  1. Maak een map waarin u de Terraform-voorbeeldcode wilt testen en van deze de huidige map wilt maken.

     terraform {
    
       required_version = ">=0.12"
    
       required_providers {
         azurerm = {
           source = "hashicorp/azurerm"
           version = "~>2.0"
         }
       }
     }
    
     provider "azurerm" {
       features {}
     }
    
     resource "azurerm_resource_group" "test" {
       name     = "acctestrg"
       location = "West US 2"
     }
    
     resource "azurerm_virtual_network" "test" {
       name                = "acctvn"
       address_space       = ["10.0.0.0/16"]
       location            = azurerm_resource_group.test.location
       resource_group_name = azurerm_resource_group.test.name
     }
    
     resource "azurerm_subnet" "test" {
       name                 = "acctsub"
       resource_group_name  = azurerm_resource_group.test.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.test.location
       resource_group_name          = azurerm_resource_group.test.name
       allocation_method            = "Static"
     }
    
     resource "azurerm_lb" "test" {
       name                = "loadBalancer"
       location            = azurerm_resource_group.test.location
       resource_group_name = azurerm_resource_group.test.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.test.location
       resource_group_name = azurerm_resource_group.test.name
    
       ip_configuration {
         name                          = "testConfiguration"
         subnet_id                     = azurerm_subnet.test.id
         private_ip_address_allocation = "dynamic"
       }
     }
    
     resource "azurerm_managed_disk" "test" {
       count                = 2
       name                 = "datadisk_existing_${count.index}"
       location             = azurerm_resource_group.test.location
       resource_group_name  = azurerm_resource_group.test.name
       storage_account_type = "Standard_LRS"
       create_option        = "Empty"
       disk_size_gb         = "1023"
     }
    
     resource "azurerm_availability_set" "avset" {
       name                         = "avset"
       location                     = azurerm_resource_group.test.location
       resource_group_name          = azurerm_resource_group.test.name
       platform_fault_domain_count  = 2
       platform_update_domain_count = 2
       managed                      = true
     }
    
     resource "azurerm_virtual_machine" "test" {
       count                 = 2
       name                  = "acctvm${count.index}"
       location              = azurerm_resource_group.test.location
       availability_set_id   = azurerm_availability_set.avset.id
       resource_group_name   = azurerm_resource_group.test.name
       network_interface_ids = [element(azurerm_network_interface.test.*.id, count.index)]
       vm_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
    
       storage_image_reference {
         publisher = "Canonical"
         offer     = "UbuntuServer"
         sku       = "16.04-LTS"
         version   = "latest"
       }
    
       storage_os_disk {
         name              = "myosdisk${count.index}"
         caching           = "ReadWrite"
         create_option     = "FromImage"
         managed_disk_type = "Standard_LRS"
       }
    
       # Optional data disks
       storage_data_disk {
         name              = "datadisk_new_${count.index}"
         managed_disk_type = "Standard_LRS"
         create_option     = "Empty"
         lun               = 0
         disk_size_gb      = "1023"
       }
    
       storage_data_disk {
         name            = element(azurerm_managed_disk.test.*.name, count.index)
         managed_disk_id = element(azurerm_managed_disk.test.*.id, count.index)
         create_option   = "Attach"
         lun             = 1
         disk_size_gb    = element(azurerm_managed_disk.test.*.disk_size_gb, count.index)
       }
    
       os_profile {
         computer_name  = "hostname"
         admin_username = "testadmin"
         admin_password = "Password1234!"
       }
    
       os_profile_linux_config {
         disable_password_authentication = false
       }
    
       tags = {
         environment = "staging"
       }
     }
    

3. Terraform initialiseren

Voer terraform init uit om de Terraform-implementatie te initialiseren.

terraform init

Belangrijkste punten:

  • Met deze opdracht worden de Azure-modules gedownload die nodig zijn om een Azure-resourcegroep te maken.

4. Een Terraform-uitvoeringsplan maken

Voer terraform plan uit om een uitvoeringsplan te maken.

terraform plan -out main.tfplan

Belangrijkste punten:

  • Met terraform plan de opdracht wordt een uitvoeringsplan gemaakt, maar niet uitgevoerd. 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 overeenkomt met uw verwachtingen voordat u wijzigingen aan werkelijke resources aantreft.
  • Met de -out optionele parameter kunt u een uitvoerbestand voor het plan opgeven. Door de parameter te gebruiken, zorgt u ervoor dat het plan dat -out u hebt gecontroleerd, precies is wat er wordt toegepast.
  • Zie de sectie beveiligingswaarschuwing voor meer informatie over persistente uitvoeringsplannen en beveiliging.

5. Een Terraform-uitvoeringsplan toepassen

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

terraform apply main.tfplan

Belangrijkste punten:

  • Met terraform apply de bovenstaande opdracht wordt ervan uitgenomen dat u eerder hebt terraform plan -out main.tfplan gebruikt.
  • Als u een andere bestandsnaam voor de parameter hebt -out opgegeven, gebruikt u dezelfde bestandsnaam in de aanroep naar terraform apply .
  • Als u de parameter niet hebt -out gebruikt, roept u gewoon terraform apply aan zonder parameters.

6. De resultaten controleren

Voer de opdracht az vm list uit met een JMESPath-query om de VM's weer te geven die in de resourcegroep zijn gemaakt.

az vm list -g acctestrg --query "[].{\"VM Name\":name}" -o table

7. Resources ops schonen

Wanneer u de resources die via Terraform zijn gemaakt niet meer nodig hebt, moet u de volgende stappen volgen:

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

    terraform plan -destroy -out main.destroy.tfplan
    

    Belangrijkste punten:

    • Met terraform plan de opdracht wordt een uitvoeringsplan gemaakt, maar niet uitgevoerd. 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 overeenkomt met uw verwachtingen voordat u wijzigingen aan werkelijke resources aantreft.
    • Met de -out optionele parameter kunt u een uitvoerbestand voor het plan opgeven. Door de parameter te gebruiken, zorgt u ervoor dat het plan dat -out u hebt gecontroleerd, precies is wat er wordt toegepast.
    • Zie de sectie beveiligingswaarschuwing voor meer informatie over persistente uitvoeringsplannen en beveiliging.
  2. Voer terraform apply uit om het uitvoeringsplan toe te passen.

    terraform apply main.destroy.tfplan
    

Problemen met Terraform in Azure oplossen

Veelvoorkomende problemen bij het gebruik van Terraform in Azure oplossen

Volgende stappen