Een linux-VM configureren met infrastructuur in Azure met behulp van Terraform

Met Terraform kunt u volledige infrastructuurimplementaties definiƫren en maken in Azure. U bouwt Terraform-sjablonen in een door mensen leesbare indeling die Azure-resources op een consistente, reproduceerbare manier maakt en configureert. In dit artikel wordt beschreven hoe u een volledige Linux-omgeving en ondersteunende resources maakt met Terraform.

In dit artikel leert u het volgende:

  • Een virtueel netwerk maken
  • Een subnet maken
  • Een openbaar IP-adres maken
  • Een netwerkbeveiligingsgroep maken
  • Een virtuele netwerkinterfacekaart maken
  • Een opslagaccount voor diagnostische gegevens maken
  • Een virtuele machine 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 Terraform-code implementeren

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

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

    # 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"
        }
    }
    

    Belangrijkste punten:

    • De machine wordt gemaakt met een nieuwe openbare SSH-sleutel. Voer uit om de bijbehorende persoonlijke sleutel op te terraform output -raw tls_private_key halen. Sla de uitvoer op in een bestand op de lokale computer en gebruik deze om u aan te melden bij de virtuele machine.

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.

Problemen met Terraform in Azure oplossen

Veelvoorkomende problemen bij het gebruik van Terraform in Azure oplossen

Volgende stappen