Leer en inglés

Compartir a través de


Inicio rápido: Creación de un equilibrador de carga público para equilibrar la carga de las máquinas virtuales mediante Terraform

En este inicio rápido se muestra cómo implementar un equilibrador de carga estándar para equilibrar la carga de las máquinas virtuales mediante Terraform.

Terraform habilita la definición, vista previa e implementación de la infraestructura en la nube. Con Terraform, se crean archivos de configuración mediante la sintaxis de HCL. La sintaxis de HCL permite especificar el proveedor de la nube, como Azure, y los elementos que componen la infraestructura de la nube. Después de crear los archivos de configuración, se crea un plan de ejecución que permite obtener una vista previa de los cambios de infraestructura antes de implementarlos. Una vez que compruebe los cambios, aplique el plan de ejecución para implementar la infraestructura.

Requisitos previos

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 denominado providers.tf e inserte el siguiente código:

    terraform {
       required_version = ">=0.12"
    
       required_providers {
         azapi = {
           source  = "azure/azapi"
           version = "~>1.5"
         }
         azurerm = {
           source  = "hashicorp/azurerm"
           version = "~>2.0"
         }
         random = {
           source  = "hashicorp/random"
           version = "~>3.0"
         }
      }
    }
    
    provider "azurerm" {
      features {}
    }
    
  3. Cree un archivo denominado main.tf e inserte el siguiente código:

    resource "random_string" "my_resource_group" {
      length  = 8
      upper   = false
     special = false
    }
    
    # Create Resource Group
    resource "azurerm_resource_group" "my_resource_group" {
     name     = "test-group-${random_string.my_resource_group.result}"
     location = var.resource_group_location
    }
    
    # Create Virtual Network
    resource "azurerm_virtual_network" "my_virtual_network" {
      name                = var.virtual_network_name
      address_space       = ["10.0.0.0/16"]
      location            = azurerm_resource_group.my_resource_group.location
      resource_group_name = azurerm_resource_group.my_resource_group.name
    }
    
    # Create a subnet in the Virtual Network
    resource "azurerm_subnet" "my_subnet" {
      name                 = var.subnet_name
      resource_group_name  = azurerm_resource_group.my_resource_group.name
      virtual_network_name = azurerm_virtual_network.my_virtual_network.name
      address_prefixes     = ["10.0.1.0/24"]
    }
    
    # Create Network Security Group and rules
    resource "azurerm_network_security_group" "my_nsg" {
      name                = var.network_security_group_name
      location            = azurerm_resource_group.my_resource_group.location
      resource_group_name = azurerm_resource_group.my_resource_group.name
    
      security_rule {
        name                       = "web"
        priority                   = 1008
        direction                  = "Inbound"
        access                     = "Allow"
        protocol                   = "Tcp"
        source_port_range          = "*"
        destination_port_range     = "80"
        source_address_prefix      = "*"
        destination_address_prefix = "10.0.1.0/24"
      }
    }
    
    # Associate the Network Security Group to the subnet
    resource "azurerm_subnet_network_security_group_association" "my_nsg_association" {
      subnet_id                 = azurerm_subnet.my_subnet.id
      network_security_group_id = azurerm_network_security_group.my_nsg.id
    }
    
    # Create Public IP
    resource "azurerm_public_ip" "my_public_ip" {
      name                = var.public_ip_name
      location            = azurerm_resource_group.my_resource_group.location
      resource_group_name = azurerm_resource_group.my_resource_group.name
      allocation_method   = "Static"
      sku                 = "Standard"
    }
    
    # Create Network Interface
    resource "azurerm_network_interface" "my_nic" {
      count               = 2
      name                = "${var.network_interface_name}${count.index}"
      location            = azurerm_resource_group.my_resource_group.location
      resource_group_name = azurerm_resource_group.my_resource_group.name
    
      ip_configuration {
        name                          = "ipconfig${count.index}"
        subnet_id                     = azurerm_subnet.my_subnet.id
        private_ip_address_allocation = "Dynamic"
        primary = true
      }
    }
    
    # Associate Network Interface to the Backend Pool of the Load Balancer
    resource "azurerm_network_interface_backend_address_pool_association" "my_nic_lb_pool" {
      count                   = 2
      network_interface_id    = azurerm_network_interface.my_nic[count.index].id
      ip_configuration_name   = "ipconfig${count.index}"
      backend_address_pool_id = azurerm_lb_backend_address_pool.my_lb_pool.id
    }
    
    # Create Virtual Machine
    resource "azurerm_linux_virtual_machine" "my_vm" {
      count                 = 2
      name                  = "${var.virtual_machine_name}${count.index}"
      location              = azurerm_resource_group.my_resource_group.location
      resource_group_name   = azurerm_resource_group.my_resource_group.name
      network_interface_ids = [azurerm_network_interface.my_nic[count.index].id]
      size                  = var.virtual_machine_size
    
      os_disk {
        name                 = "${var.disk_name}${count.index}"
        caching              = "ReadWrite"
        storage_account_type = var.redundancy_type
      }
    
      source_image_reference {
        publisher = "Canonical"
        offer     = "0001-com-ubuntu-server-jammy"
        sku       = "22_04-lts-gen2"
        version   = "latest"
      }
    
      admin_username                  = var.username
      admin_password                  = var.password
      disable_password_authentication = false
    
    }
    
    # Enable virtual machine extension and install Nginx
    resource "azurerm_virtual_machine_extension" "my_vm_extension" {
      count                = 2
      name                 = "Nginx"
      virtual_machine_id   = azurerm_linux_virtual_machine.my_vm[count.index].id
      publisher            = "Microsoft.Azure.Extensions"
      type                 = "CustomScript"
      type_handler_version = "2.0"
    
      settings = <<SETTINGS
     {
      "commandToExecute": "sudo apt-get update && sudo apt-get install nginx -y && echo \"Hello World from $(hostname)\" > /var/www/html/index.html && sudo systemctl restart nginx"
     }
    SETTINGS
    
    }
    
    # Create Public Load Balancer
    resource "azurerm_lb" "my_lb" {
      name                = var.load_balancer_name
      location            = azurerm_resource_group.my_resource_group.location
      resource_group_name = azurerm_resource_group.my_resource_group.name
      sku                 = "Standard"
    
      frontend_ip_configuration {
        name                 = var.public_ip_name
        public_ip_address_id = azurerm_public_ip.my_public_ip.id
      }
    }
    
    resource "azurerm_lb_backend_address_pool" "my_lb_pool" {
      loadbalancer_id      = azurerm_lb.my_lb.id
      name                 = "test-pool"
    }
    
    resource "azurerm_lb_probe" "my_lb_probe" {
      resource_group_name = azurerm_resource_group.my_resource_group.name
      loadbalancer_id     = azurerm_lb.my_lb.id
      name                = "test-probe"
      port                = 80
    }
    
    resource "azurerm_lb_rule" "my_lb_rule" {
      resource_group_name            = azurerm_resource_group.my_resource_group.name
      loadbalancer_id                = azurerm_lb.my_lb.id
      name                           = "test-rule"
      protocol                       = "Tcp"
      frontend_port                  = 80
      backend_port                   = 80
      disable_outbound_snat          = true
      frontend_ip_configuration_name = var.public_ip_name
      probe_id                       = azurerm_lb_probe.my_lb_probe.id
      backend_address_pool_ids       = [azurerm_lb_backend_address_pool.my_lb_pool.id]
    }
    
    resource "azurerm_lb_outbound_rule" "my_lboutbound_rule" {
      resource_group_name     = azurerm_resource_group.my_resource_group.name
      name                    = "test-outbound"
      loadbalancer_id         = azurerm_lb.my_lb.id
      protocol                = "Tcp"
      backend_address_pool_id = azurerm_lb_backend_address_pool.my_lb_pool.id
    
      frontend_ip_configuration {
        name = var.public_ip_name
      }
    }
    
  4. Cree un archivo denominado variables.tf e inserte el siguiente código:

    variable "resource_group_location" {
      type        = string
      default     = "eastus"
      description = "Location of the resource group."
    }
    
    variable "username" {
      type        = string
      default     = "microsoft"
      description = "The username for the local account that will be created on the new VM."
    }
    
    variable "password" {
      type        = string
      default     = "Microsoft@123"
      description = "The password for the local account that will be created on the new VM."
    }
    
    variable "virtual_network_name" {
      type        = string
      default     = "test-vnet"
      description = "Name of the Virtual Network."
    }
    
    variable "subnet_name" {
      type        = string
      default     = "test-subnet"
      description = "Name of the subnet."
    }
    
    variable public_ip_name {
      type        = string
      default     = "test-public-ip"
      description = "Name of the Public IP."
    }
    
    variable network_security_group_name {
      type        = string
      default     = "test-nsg"
      description = "Name of the Network Security Group."
    }
    
    variable "network_interface_name" {
      type        = string
      default     = "test-nic"
      description = "Name of the Network Interface."  
    }
    
    variable "virtual_machine_name" {
      type        = string
      default     = "test-vm"
      description = "Name of the Virtual Machine."
    }
    
    variable "virtual_machine_size" {
      type        = string
      default     = "Standard_B2s"
      description = "Size or SKU of the Virtual Machine."
    }
    
    variable "disk_name" {
      type        = string
      default     = "test-disk"
      description = "Name of the OS disk of the Virtual Machine."
    }
    
    variable "redundancy_type" {
      type        = string
      default     = "Standard_LRS"
      description = "Storage redundancy type of the OS disk."
    }
    
    variable "load_balancer_name" {
      type        = string
      default     = "test-lb"
      description = "Name of the Load Balancer."
    }
    
  5. Cree un archivo denominado outputs.tf e inserte el siguiente código:

    output "public_ip_address" {
      value = "http://${azurerm_public_ip.my_public_ip.ip_address}"
    }
    

Inicialización de Terraform

Para inicializar la implementación de Terraform, ejecute terraform init. Este comando descarga el proveedor de Azure necesario para administrar los recursos de Azure.

Consola
terraform init -upgrade

Puntos clave:

  • El parámetro -upgrade actualiza los complementos de proveedor necesarios a la versión más reciente que cumpla con las restricciones de versión de la configuración.

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

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

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

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.

Consola
terraform apply main.tfplan

Puntos clave:

  • El comando terraform apply de ejemplo asume que ejecutó terraform plan -out main.tfplan previamente.
  • 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, llame a terraform apply sin ningún parámetro.

Verificación de los resultados

  1. Al aplicar el plan de ejecución, Terraform mostrará la dirección IP pública de front-end. Si borró la pantalla, es posible recuperar ese valor con el siguiente comando de Terraform:

    Consola
    echo $(terraform output -raw public_ip_address)
    
  2. Pegue la dirección IP pública en la barra de direcciones del explorador. La página de VM personalizada del servidor web Nginx se muestra en el explorador.

Limpieza de recursos

Cuando ya no necesite los recursos creados a través de Terraform, realice los pasos siguientes:

  1. Ejecute el comando terraform plan y especifique la marca destroy.

    Consola
    terraform plan -destroy -out main.destroy.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.
  2. Ejecute terraform apply para aplicar el plan de ejecución.

    Consola
    terraform apply main.destroy.tfplan
    

Solución de problemas de Terraform en Azure

Solución de problemas comunes al usar Terraform en Azure

Pasos siguientes

En esta guía de inicio rápido:

  • Ha creado un Azure Load Balancer
  • Ha conectado 2 máquinas virtuales al equilibrador de carga
  • Ha probado el equilibrador de carga.

Para más información sobre Azure Load Balancer, vaya a: