Vytvoření clusteru virtuálních počítače Azure pomocí Terraformu a HCL

V tomto článku se dočtete, jak vytvořit malý výpočetní cluster pomocí seznamu HCL.

V tomto článku získáte informace o těchto tématech:

  • Nastavte ověřování Azure.
  • Vytvořte konfigurační soubor Terraformu.
  • K vytvoření nástroje pro vyrovnávání zatížení použijte konfigurační soubor Terraformu.
  • Pomocí konfiguračního souboru Terraformu nasaďte dva virtuální počítače s Linuxem ve skupině dostupnosti.
  • Inicializujte Terraform.
  • Vytvořte plán provádění Terraformu.
  • K vytvoření prostředků Azure použijte plán provádění Terraformu.

1. Konfigurace prostředí

  • Předplatné Azure: Pokud ještě nemáte předplatné Azure, vytvořte si bezplatný účet před tím, než začnete.

2. Implementace kódu

  1. Vytvořte adresář, ve kterém chcete otestovat ukázkový kód Terraformu, a napište ho jako aktuální adresář.

     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. Inicializace Terraformu

Spuštěním terraform init init inicializovali nasazení Terraformu.

terraform init

Klíčové body:

  • Tento příkaz stáhne moduly Azure potřebné k vytvoření skupiny prostředků Azure.

4. Vytvoření plánu provádění Terraformu

Spusťte příkaz terraform plan a vytvořte plán spuštění.

terraform plan -out main.tfplan

Klíčové body:

  • Příkaz terraform plan vytvoří plán spuštění, ale nes jeho provedení. Místo toho určuje, jaké akce jsou nezbytné k vytvoření konfigurace zadané v konfiguračních souborech. Tento model umožňuje před provedením jakýchkoli změn skutečných prostředků ověřit, jestli plán provádění odpovídá vašim očekáváním.
  • Volitelný -out parametr umožňuje zadat výstupní soubor pro plán. Použitím parametru zajistíte, že se právě použije plán, který -out jste si prohlédněte.
  • Další informace o zachování plánů provádění a zabezpečení najdete v části s upozorněním zabezpečení.

5. Použití plánu provádění Terraformu

Spuštěním příkazu terraform apply aplikujte plán spuštění na cloudovou infrastrukturu.

terraform apply main.tfplan

Klíčové body:

  • Výše terraform apply uvedený příkaz předpokládá, že jste předtím spustili terraform plan -out main.tfplan příkaz .
  • Pokud jste pro parametr zadali jiný název souboru, použijte stejný název souboru -out ve volání metody terraform apply .
  • Pokud jste parametr -out nepou3/4ít, stačí volat terraform apply bez parametrů.

6. Ověření výsledků

Spuštěním příkazu az vm list s dotazem JMESPath zobrazte virtuální počítače vytvořené ve skupině prostředků.

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

7. Vyčištění prostředků

Pokud už nepotřebujete prostředky vytvořené přes Terraform, proveďte následující kroky:

  1. Spusťte příkaz terraform plan a zadejte příznak .

    terraform plan -destroy -out main.destroy.tfplan
    

    Klíčové body:

    • Příkaz terraform plan vytvoří plán spuštění, ale nes jeho provedení. Místo toho určuje, jaké akce jsou nezbytné k vytvoření konfigurace zadané v konfiguračních souborech. Tento model umožňuje před provedením jakýchkoli změn skutečných prostředků ověřit, jestli plán provádění odpovídá vašim očekáváním.
    • Volitelný -out parametr umožňuje zadat výstupní soubor pro plán. Použitím parametru zajistíte, že se právě použije plán, který -out jste si prohlédněte.
    • Další informace o zachování plánů provádění a zabezpečení najdete v části s upozorněním zabezpečení.
  2. Spuštěním příkazu terraform apply použijte plán spuštění.

    terraform apply main.destroy.tfplan
    

Řešení potíží s Terraformem v Azure

Řešení běžných problémů při používání Terraformu v Azure

Další kroky