Configuración de una máquina virtual Linux con infraestructura en Azure mediante Terraform

Terraform permite definir y crear implementaciones completas de infraestructura de Azure. Se crean plantillas de Terraform en un formato legible para el usuario para crear y configurar recursos de Azure de forma coherente y reproducible. En este artículo se muestra cómo crear un entorno completo de Linux y recursos de apoyo con Terraform.

En este artículo aprenderá a:

  • Creación de una red virtual
  • Creación de una subred
  • Crear una dirección IP pública
  • Crear un grupo de seguridad de red
  • Creación de una tarjeta de interfaz de red virtual
  • Creación de una cuenta de almacenamiento para diagnóstico
  • Creación de una máquina virtual

1. Configurar su entorno

  • Suscripción de Azure: Si no tiene una suscripción a Azure, cree una cuenta gratuita antes de empezar.

2. Implementación del código de Terraform

  1. Cree un directorio en el que probar el código de ejemplo de Terraform y conviértalo en el directorio actual.

  2. Cree un archivo llamado main.tf e inserte el siguiente código:

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

    Puntos clave:

    • La máquina se creará con una nueva clave pública SSH. Para obtener la clave privada correspondiente, ejecute terraform output -raw tls_private_key. Guarde la salida en un archivo de la máquina local y úsela para iniciar sesión en la máquina virtual.

3. Inicialización de Terraform

Para inicializar la implementación de Terraform, ejecute terraform init.

terraform init

Puntos clave:

  • Este comando descarga los módulos de Azure necesarios para crear un grupo de recursos de Azure.

4. Creación de un plan de ejecución de Terraform

Ejecute terraform plan para crear un plan de ejecución.

terraform plan -out main.tfplan

Puntos clave:

  • El comando terraform plan crea un plan de ejecución, pero no lo ejecuta. En su lugar, determina qué acciones son necesarias para crear la configuración especificada en los archivos de configuración. Este patrón le permite comprobar si el plan de ejecución coincide con sus expectativas antes de realizar cambios en los recursos reales.
  • El parámetro -out opcional permite especificar un archivo de salida para el plan. El uso del parámetro -out garantiza que el plan que ha revisado es exactamente lo que se aplica.
  • Para más información acerca de la seguridad y conservar los planes de ejecución, consulte la sección Advertencia de seguridad.

5. Aplicación de un plan de ejecución de Terraform

Ejecute terraform apply para aplicar el plan de ejecución a su infraestructura en la nube.

terraform apply main.tfplan

Puntos clave:

  • El comando terraform apply anterior da por hecho que ejecutó anteriormente terraform plan -out main.tfplan.
  • Si especificó un nombre de archivo diferente para el parámetro -out, use ese mismo nombre de archivo en la llamada a terraform apply.
  • Si no ha utilizado el parámetro -out, simplemente llame a terraform apply sin ningún parámetro.

Solución de problemas de Terraform en Azure

Solución de problemas comunes al usar Terraform en Azure

Pasos siguientes