Konfigurace virtuálního počítače s Linuxem s infrastrukturou v Azure pomocí Terraformu

Terraform umožňuje definovat a vytvářet kompletní nasazení infrastruktury v Azure. Šablony Terraformu vytváříte v lidsky čitelném formátu, který vytváří a konfiguruje prostředky Azure konzistentním a reprodukovatelným způsobem. V tomto článku si ukážeme, jak vytvořit kompletní linuxové prostředí a podpůrné prostředky pomocí Terraformu.

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ě
  • Vytvoření virtuální síťové karty
  • Vytvoření účtu úložiště pro diagnostiku
  • Vytvoření virtuálního počítače

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 Terraformu

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

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

    # Configure the Microsoft Azure Provider
    terraform {
      required_providers {
        azurerm = {
          source = "hashicorp/azurerm"
          version = "~>2.0"
        }
      }
    }
    provider "azurerm" {
      features {}
    }
    
    # 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_prefixes       = ["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 (and display) an SSH key
    resource "tls_private_key" "example_ssh" {
      algorithm = "RSA"
      rsa_bits = 4096
    }
    output "tls_private_key" { 
        value = tls_private_key.example_ssh.private_key_pem 
        sensitive = true
    }
    
    # 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       = "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.mystorageaccount.primary_blob_endpoint
        }
    
        tags = {
            environment = "Terraform Demo"
        }
    }
    

    Klíčové body:

    • Počítač se vytvoří s novým veřejným klíčem SSH. Pokud chcete získat odpovídající privátní klíč, spusťte terraform output -raw tls_private_key příkaz . Uložte výstup do souboru na místním počítači a použijte ho k přihlášení k virtuálnímu počítači.

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ů.

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

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

Další kroky