Crear maquina virtual en Azure con Terraform

¿Que es Terraform?

Terraform es un software de infraestructura como código (infrastructure as code) desarrollado por HashiCorp. Permite a los usuarios definir y configurar la infraestructura de un centro de datos en un lenguaje de alto nivel, generando un plan de ejecución para desplegar la infraestructura en OpenStack,3​ por ejemplo, u otros proveedores de servicio tales como AWSIBM Cloud (antiguamente Bluemix), Google Cloud PlatformLinode,45​ Microsoft AzureOracle Cloud Infrastructure o VMware vSphere.678910​ La infraestructura se define utilizando la sintaxis de configuración de HashiCorp denominada HashiCorp Configuration Language (HCL) o, en su defecto, el formato JSON.11

Cómo desplegar una máquina virtual en Azure mediante Terraform

Azure es una de las plataformas de nube más populares y utilizadas en la actualidad. Además, Terraform es una herramienta de infraestructura como código que permite automatizar la creación, configuración y gestión de recursos en diversas plataformas de nube. En este artículo, te mostraremos cómo desplegar una máquina virtual en Azure mediante Terraform.

Configurar el entorno de trabajo

Antes de comenzar a trabajar con Terraform en Azure, es necesario tener configurado el entorno de trabajo. Para ello, se deben seguir los siguientes pasos:

  • Instalar la CLI de Azure
  • Crear una cuenta de servicio en Azure y asignarle los permisos necesarios
  • Configurar las credenciales de la cuenta de servicio en la CLI de Azure
  • Descargar e instalar Terraform

Crear el archivo de configuración para los «provider»

En el primer fichero de configuración llamado providers.tf configuraremos los provider

En Terraform, un «provider» es un componente que permite a Terraform interactuar con un servicio o tecnología específica, como por ejemplo Amazon Web Services (AWS), Microsoft Azure, Google Cloud Platform (GCP), o cualquier otro proveedor de servicios.

Cada proveedor de Terraform incluye una serie de recursos y datos, que se pueden usar para definir la infraestructura y configuración que se desea crear en ese servicio.

#Configure the Azure provider
terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "=3.39.0"
    }
  }
}

provider "azurerm" {
  features {}
}

Crear el archivo de configuración

El siguiente paso es crear el archivo de configuración de Terraform. En este archivo, se especifican los recursos que se van a crear y su configuración. En el caso de la máquina virtual, se pueden especificar aspectos como el tamaño de la máquina, la imagen del sistema operativo, la dirección IP, entre otros.

El siguiente es un ejemplo de archivo de configuración:

variable "prefix" {
  default = "SRVLRO001"
}

# Creación de grupo de recursos
resource "azurerm_resource_group" "RG-Red-Orbita" {
  name     = "RedOrbita"
  location = "West Europe"
}

# Creación de red virtual
resource "azurerm_virtual_network" "VNET-Red-Orbita" {
  name                = "RedOrbita-Vnet"
  address_space       = ["10.30.0.0/24"]
  location            = azurerm_resource_group.RG-Red-Orbita.location
  resource_group_name = azurerm_resource_group.RG-Red-Orbita.name
}

# Creación de subred
resource "azurerm_subnet" "Subnet-FrontEnd" {
  name                 = "FrontEnd"
  resource_group_name  = azurerm_resource_group.RG-Red-Orbita.name
  virtual_network_name = azurerm_virtual_network.VNET-Red-Orbita.name
  address_prefixes     = ["10.30.0.0/28"]
}


resource "azurerm_network_interface" "VM-Interface" {
  name                = "${var.prefix}-nic"
  location            = azurerm_resource_group.RG-Red-Orbita.location
  resource_group_name = azurerm_resource_group.RG-Red-Orbita.name

  ip_configuration {
    name                          = "testconfiguration1"
    subnet_id                     = azurerm_subnet.Subnet-FrontEnd.id
    private_ip_address_allocation = "Dynamic"
  }
}

resource "azurerm_virtual_machine" "main" {
  name                  = "${var.prefix}-vm"
  location              = azurerm_resource_group.RG-Red-Orbita.location
  resource_group_name   = azurerm_resource_group.RG-Red-Orbita.name
  network_interface_ids = [azurerm_network_interface.VM-Interface.id]
  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

  source_image_reference {
    publisher = "Canonical"
    offer     = "0001-com-ubuntu-server-focal"
    sku       = "20_04-lts-gen2"
    version   = "20.04.202209200"
  }

  storage_os_disk {
    name              = "${var.prefix}_Os_Disk"
    caching           = "ReadWrite"
    create_option     = "FromImage"
    managed_disk_type = "Standard_LRS"
  }
  os_profile {
    computer_name  = "${var.prefix}"
    admin_username = "testadmin"
    admin_password = "Password1234!"
  }
  os_profile_linux_config {
    disable_password_authentication = false
  }
  tags = {
    environment = "staging"
  }
}

Para poder ver el listado de imagenes disponibles (en este caso Ubuntu) lo podemos hacer de la siguiente forma:

az vm image list --all --publisher="Canonical" --sku="20_04-lts-gen2"

Nos logamos a Azure

az login
az account set -s "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Desplegamos

 
 terraform init
 terraform plan
 terraform apply

En caso que tengamos que importar algún estado como por ejemplo en mi caso el grupo de recurso y la vnet. Esto nos creará un fichero llamado «terraform.tfstate» el cual guarda todos los estados de los recursos importados.

terraform import azurerm_resource_group.RG-RedOrbita  /subscriptions/XXXXXXXXXXXXXXXXXXXXXXXXXX/resourceGroups/RedOrbita

terraform import azurerm_virtual_network.VNET-Red-Orbita /subscriptions/XXXXXXXXXXXXXXXXXXXXXXXXXX/resourceGroups/RedOrbita/providers/Microsoft.Network/virtualNetworks/RedOrbita-Vnet

terraform import azurerm_subnet.Subnet-FrontEnd /subscriptions/XXXXXXXXXXXXXXXXXXXXXXXXXX/resourceGroups/RedOrbita/providers/Microsoft.Network/virtualNetworks/RedOrbita-Vnet/subnets/FrontEnd

Más información

Más información

:wq!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *