Rychlý start: Vytvoření virtuálního počítače s Linuxem pomocí Terraformu

Platí pro: ✔️ Virtuální počítače s Linuxem

Článek otestovaný s následujícími verzemi zprostředkovatele Terraformu a Terraformu:

V tomto článku se dozvíte, jak vytvořit kompletní linuxové prostředí a podpůrné prostředky pomocí Terraformu. Mezi tyto prostředky patří virtuální síť, podsíť, veřejná IP adresa a další.

Terraform umožňuje definici, verzi Preview a nasazení cloudové infrastruktury. Pomocí Terraformu vytvoříte konfigurační soubory pomocí syntaxe HCL. Syntaxe seznamu HCL umožňuje určit poskytovatele cloudu , například Azure, a prvky, které tvoří vaši cloudovou infrastrukturu. Po vytvoření konfiguračních souborů vytvoříte plán spouštění , který vám umožní zobrazit náhled změn infrastruktury před jejich nasazením. Po ověření změn použijete plán provádění k nasazení infrastruktury.

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

  • Vytvoření virtuální sítě
  • Vytvoření podsítě
  • Vytvoření veřejné IP adresy
  • Vytvoření skupiny zabezpečení sítě a příchozího pravidla SSH
  • Vytvoření virtuální síťové karty
  • Připojení skupiny zabezpečení sítě k síťovému rozhraní
  • Vytvoření účtu úložiště pro diagnostiku spouštění
  • Vytvoření klíče SSH
  • Vytvoření virtuálního počítače
  • Připojení k virtuálnímu počítači pomocí SSH

Požadavky

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

Implementace kódu Terraformu

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

  2. Vytvořte soubor s názvem providers.tf a vložte následující kód:

    terraform {
      required_version = ">=0.12"
    
      required_providers {
        azurerm = {
          source  = "hashicorp/azurerm"
          version = "~>2.0"
        }
        random = {
          source  = "hashicorp/random"
          version = "~>3.0"
        }
        tls = {
          source = "hashicorp/tls"
          version = "~>4.0"
        }
      }
    }
    
    provider "azurerm" {
      features {}
    }
    
  3. Vytvořte soubor s názvem main.tf a vložte následující kód:

    resource "random_pet" "rg_name" {
      prefix = var.resource_group_name_prefix
    }
    
    resource "azurerm_resource_group" "rg" {
      location = var.resource_group_location
      name     = random_pet.rg_name.id
    }
    
    # Create virtual network
    resource "azurerm_virtual_network" "my_terraform_network" {
      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" "my_terraform_subnet" {
      name                 = "mySubnet"
      resource_group_name  = azurerm_resource_group.rg.name
      virtual_network_name = azurerm_virtual_network.my_terraform_network.name
      address_prefixes     = ["10.0.1.0/24"]
    }
    
    # Create public IPs
    resource "azurerm_public_ip" "my_terraform_public_ip" {
      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" "my_terraform_nsg" {
      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" "my_terraform_nic" {
      name                = "myNIC"
      location            = azurerm_resource_group.rg.location
      resource_group_name = azurerm_resource_group.rg.name
    
      ip_configuration {
        name                          = "my_nic_configuration"
        subnet_id                     = azurerm_subnet.my_terraform_subnet.id
        private_ip_address_allocation = "Dynamic"
        public_ip_address_id          = azurerm_public_ip.my_terraform_public_ip.id
      }
    }
    
    # Connect the security group to the network interface
    resource "azurerm_network_interface_security_group_association" "example" {
      network_interface_id      = azurerm_network_interface.my_terraform_nic.id
      network_security_group_id = azurerm_network_security_group.my_terraform_nsg.id
    }
    
    # Generate random text for a unique storage account name
    resource "random_id" "random_id" {
      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" "my_storage_account" {
      name                     = "diag${random_id.random_id.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" "my_terraform_vm" {
      name                  = "myVM"
      location              = azurerm_resource_group.rg.location
      resource_group_name   = azurerm_resource_group.rg.name
      network_interface_ids = [azurerm_network_interface.my_terraform_nic.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.my_storage_account.primary_blob_endpoint
      }
    }
    
  4. Vytvořte soubor s názvem variables.tf a vložte následující kód:

    variable "resource_group_location" {
      default     = "eastus"
      description = "Location of the resource group."
    }
    
    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."
    }
    
  5. Vytvořte soubor s názvem outputs.tf a vložte následující kód:

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

Inicializace Terraformu

Spuštěním příkazu terraform init inicializujete nasazení Terraformu. Tento příkaz stáhne moduly Azure potřebné ke správě prostředků Azure.

terraform init

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

Spuštěním plánu terraform vytvořte plán provádění.

terraform plan -out main.tfplan

Klíčové body:

  • Příkaz terraform plan vytvoří plán provádění, ale nespustí ho. Místo toho určuje, jaké akce jsou nezbytné k vytvoření konfigurace zadané v konfiguračních souborech. Tento model umožňuje ověřit, jestli plán provádění odpovídá vašim očekáváním, než provedete jakékoli změny skutečných prostředků.
  • Volitelný -out parametr umožňuje zadat výstupní soubor pro plán. Pomocí parametru -out zajistíte, že plán, který jste zkontrolovali, je přesně to, co se použije.
  • Další informace o zachování plánů spouštění a zabezpečení najdete v části Upozornění zabezpečení.

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

Spuštění terraformu platí pro použití plánu provádění pro vaši cloudovou infrastrukturu.

terraform apply main.tfplan

Klíčové body:

  • Výše terraform apply uvedený příkaz předpokládá, že jste dříve spustili terraform plan -out main.tfplan.
  • Pokud jste pro parametr zadali jiný název souboru -out , použijte stejný název souboru ve volání terraform apply.
  • Pokud jste parametr nepoužili -out , volejte bez terraform apply parametrů.

Ověření výsledků

Pokud chcete pro připojení k virtuálnímu počítači použít SSH, postupujte následovně:

  1. Spuštěním výstupu terraformu získejte privátní klíč SSH a uložte ho do souboru.

    terraform output -raw tls_private_key > id_rsa
    
  2. Spuštěním výstupu terraformu získejte veřejnou IP adresu virtuálního počítače.

    terraform output public_ip_address
    
  3. Pomocí SSH se připojte k virtuálnímu počítači.

    ssh -i id_rsa azureuser@<public_ip_address>
    

    Klíčové body:

    • V závislosti na oprávněních vašeho prostředí se může při pokusu o připojení k virtuálnímu počítači pomocí id_rsa souboru klíče zobrazit chyba. Pokud se zobrazí chyba oznamující, že soubor privátního klíče je nechráněný a nejde ho použít, zkuste spustit následující příkaz: chmod 600 id_rsa, který omezí přístup ke čtení a zápisu vlastníkovi souboru.

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

Pokud už prostředky vytvořené prostřednictvím Terraformu nepotřebujete, proveďte následující kroky:

  1. Spusťte plán terraformu a zadejte destroy příznak.

    terraform plan -destroy -out main.destroy.tfplan
    

    Klíčové body:

    • Příkaz terraform plan vytvoří plán provádění, ale nespustí ho. Místo toho určuje, jaké akce jsou nezbytné k vytvoření konfigurace zadané v konfiguračních souborech. Tento model umožňuje ověřit, jestli plán provádění odpovídá vašim očekáváním, než provedete jakékoli změny skutečných prostředků.
    • Volitelný -out parametr umožňuje zadat výstupní soubor pro plán. Pomocí parametru -out zajistíte, že plán, který jste zkontrolovali, je přesně to, co se použije.
    • Další informace o zachování plánů spouštění a zabezpečení najdete v části Upozornění zabezpečení.
  2. Spuštění terraformu platí pro použití plánu provádě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

V tomto rychlém startu jste nasadili jednoduchý virtuální počítač pomocí Terraformu. Další informace o virtuálních počítačích Azure najdete v kurzu pro virtuální počítače s Linuxem.