Creación de un clúster de máquinas virtuales de Azure con Terraform y HCL

En este artículo, verá cómo crear un pequeño clúster de proceso mediante HCL.

En este artículo aprenderá a:

  • Configuración de la autenticación con Azure.
  • Creación de un archivo de configuración de Terraform.
  • Uso de un archivo de configuración de Terraform para crear un equilibrador de carga.
  • Uso de un archivo de configuración de Terraform para implementar dos máquinas virtuales Linux en un conjunto de disponibilidad.
  • Inicialice Terraform.
  • Creación de un plan de ejecución de Terraform.
  • Aplicación del plan de ejecución de Terraform para crear los recursos de Azure.

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

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

     terraform {
    
       required_version = ">=0.12"
    
       required_providers {
         azurerm = {
           source = "hashicorp/azurerm"
           version = "~>2.0"
         }
       }
     }
    
     provider "azurerm" {
       features {}
     }
    
     resource "azurerm_resource_group" "test" {
       name     = "acctestrg"
       location = "West US 2"
     }
    
     resource "azurerm_virtual_network" "test" {
       name                = "acctvn"
       address_space       = ["10.0.0.0/16"]
       location            = azurerm_resource_group.test.location
       resource_group_name = azurerm_resource_group.test.name
     }
    
     resource "azurerm_subnet" "test" {
       name                 = "acctsub"
       resource_group_name  = azurerm_resource_group.test.name
       virtual_network_name = azurerm_virtual_network.test.name
       address_prefixes     = ["10.0.2.0/24"]
     }
    
     resource "azurerm_public_ip" "test" {
       name                         = "publicIPForLB"
       location                     = azurerm_resource_group.test.location
       resource_group_name          = azurerm_resource_group.test.name
       allocation_method            = "Static"
     }
    
     resource "azurerm_lb" "test" {
       name                = "loadBalancer"
       location            = azurerm_resource_group.test.location
       resource_group_name = azurerm_resource_group.test.name
    
       frontend_ip_configuration {
         name                 = "publicIPAddress"
         public_ip_address_id = azurerm_public_ip.test.id
       }
     }
    
     resource "azurerm_lb_backend_address_pool" "test" {
       loadbalancer_id     = azurerm_lb.test.id
       name                = "BackEndAddressPool"
     }
    
     resource "azurerm_network_interface" "test" {
       count               = 2
       name                = "acctni${count.index}"
       location            = azurerm_resource_group.test.location
       resource_group_name = azurerm_resource_group.test.name
    
       ip_configuration {
         name                          = "testConfiguration"
         subnet_id                     = azurerm_subnet.test.id
         private_ip_address_allocation = "dynamic"
       }
     }
    
     resource "azurerm_managed_disk" "test" {
       count                = 2
       name                 = "datadisk_existing_${count.index}"
       location             = azurerm_resource_group.test.location
       resource_group_name  = azurerm_resource_group.test.name
       storage_account_type = "Standard_LRS"
       create_option        = "Empty"
       disk_size_gb         = "1023"
     }
    
     resource "azurerm_availability_set" "avset" {
       name                         = "avset"
       location                     = azurerm_resource_group.test.location
       resource_group_name          = azurerm_resource_group.test.name
       platform_fault_domain_count  = 2
       platform_update_domain_count = 2
       managed                      = true
     }
    
     resource "azurerm_virtual_machine" "test" {
       count                 = 2
       name                  = "acctvm${count.index}"
       location              = azurerm_resource_group.test.location
       availability_set_id   = azurerm_availability_set.avset.id
       resource_group_name   = azurerm_resource_group.test.name
       network_interface_ids = [element(azurerm_network_interface.test.*.id, count.index)]
       vm_size               = "Standard_DS1_v2"
    
       # Uncomment this line to delete the OS disk automatically when deleting the VM
       # delete_os_disk_on_termination = true
    
       # Uncomment this line to delete the data disks automatically when deleting the VM
       # delete_data_disks_on_termination = true
    
       storage_image_reference {
         publisher = "Canonical"
         offer     = "UbuntuServer"
         sku       = "16.04-LTS"
         version   = "latest"
       }
    
       storage_os_disk {
         name              = "myosdisk${count.index}"
         caching           = "ReadWrite"
         create_option     = "FromImage"
         managed_disk_type = "Standard_LRS"
       }
    
       # Optional data disks
       storage_data_disk {
         name              = "datadisk_new_${count.index}"
         managed_disk_type = "Standard_LRS"
         create_option     = "Empty"
         lun               = 0
         disk_size_gb      = "1023"
       }
    
       storage_data_disk {
         name            = element(azurerm_managed_disk.test.*.name, count.index)
         managed_disk_id = element(azurerm_managed_disk.test.*.id, count.index)
         create_option   = "Attach"
         lun             = 1
         disk_size_gb    = element(azurerm_managed_disk.test.*.disk_size_gb, count.index)
       }
    
       os_profile {
         computer_name  = "hostname"
         admin_username = "testadmin"
         admin_password = "Password1234!"
       }
    
       os_profile_linux_config {
         disable_password_authentication = false
       }
    
       tags = {
         environment = "staging"
       }
     }
    

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.

6. Verificación de los resultados

Ejecute el comando az vm list con una consulta JMESPath para mostrar las máquinas virtuales creadas en el grupo de recursos.

az vm list -g acctestrg --query "[].{\"VM Name\":name}" -o table

7. Limpieza de recursos

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

  1. Ejecute el plan de Terraform y especifique la marca.

    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.
    • Para más información acerca de la seguridad y conservar los planes de ejecución, consulte la sección Advertencia de seguridad.
  2. Ejecute terraform apply para aplicar el plan de ejecución.

    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