La mayoría de nosotros lo hemos hecho: implementamos máquinas virtuales temporales en Azure. Algo que muchos de nosotros además hemos hecho es olvidarnos de borrar los recursos adjuntos a esas máquinas virtuales al eliminarlas. Esto puede generar costos no deseados que ascienden a cientos de dólares si no tiene cuidado.
En este post, aprenderemos cómo poner en práctica máquinas virtuales en Azure y borrar todo rastro de ellas cuando terminemos de utilizar Terraform.
Prerrequisitos
Debe cumplir con algunos requerimientos previos para poder seguir este post:
- Tener el CLI de Azure instalado.
- Sea un administrador de una suscripción de Azure (o semejante), lo que le posibilita usarla para crear recursos y grupos de recursos.
Con esto fuera del camino, comencemos por descargar e instalar Terraform.
Instalación de Terraform
Terraform se puede instalar de diferentes formas. En Windows, la forma más sencilla es utilizar choco:
choco install terraform
En Macintosh, está habilitada a través de Brew:
brew install terraform
Más información sobre la instalación de Terraform está habilitada en el Documentación de terraform.
Suponiendo que todo ha ido bien con la instalación, puede confirmar que funciona ejecutando el comando terraform version
.
Ahora que ha confirmado que terraform funciona en su máquina, es hora de autenticarse en la suscripción de Azure a través de la CLI de Azure.
Autenticando
Para autenticarse y determinar la suscripción en la CLI de Azure, debe iniciar sesión. Abra una terminal y escriba:
az login
Y después, después de autenticarse, enumere todas sus suscripciones ingresando:
az account list
Si tiene varias suscripciones disponibles, copie la identificación de suscripción de la correcta e ingrese:
az account set --subscription="COPIED_SUBSCRIPTION_ID"
Ahora ha configurado la CLI de Azure para utilizar su suscripción. (Esta es la suscripción que terraform usará más adelante además). Ahora es el momento de crear la plantilla terraform que usaremos para poner en práctica nuestra VM.
Crear la plantilla de Terraform
La plantilla Terraform es un archivo de texto simple con el final del archivo .tf. Dispone de una sintaxis semejante a JSON y se puede leer y generar fácilmente. La plantilla consta principalmente de dos partes: los proveedores (que manejan la comunicación con el servicio en el que desea poner en práctica) y los recursos que crea el proveedor.
Empezamos creando un archivo llamado vm.tf en un directorio vacío. Terraform necesitará un directorio vacío para poder escribir el estado de la configuración más adelante.
Ahora, abra ese archivo con su editor de texto favorito y agregue el proveedor:
provider "azurerm" {
version = "=2.11.0"
features {}
}
Esto le dirá a Terraform que desea utilizar el proveedor AzureRM (para crear recursos azure) y que debe ser de la versión 2.11. Es esencial especificar el número de versión debido a que la funcionalidad entre diferentes versiones puede variar mucho.
Una vez que haya escrito eso en el archivo de texto, es hora de agregar nuestro grupo de recursos de Azure. Terraform además ve esto como un recurso:
resource "azurerm_resource_group" "resourcegroup" {
name = "test-vm"
location = "westus"
tags = {
project = "some_test_project"
}
}
El código anterior crea un grupo de recursos denominado «test-vm» que se encuentra en la región occidental de EE. UU. Además agrega una etiqueta con el nombre del proyecto.
Para ejecutar una máquina virtual con éxito, además necesitamos una red. Y debido a que Terraform está hecho para Infraestructura como código (IaC), además está habilitada como recurso:
resource "azurerm_virtual_network" "network" {
name = "${azurerm_resource_group.resourcegroup.name}-network"
address_space = ["10.0.0.0/16"]
location = azurerm_resource_group.resourcegroup.location
resource_group_name = azurerm_resource_group.resourcegroup.name
tags = azurerm_resource_group.resourcegroup.tags
}
Esto crea una red virtual. Además utiliza una variable en el nombre parámetro. Si observa con atención, verá que se refiere al grupo de recursos que definimos previamente:
"${azurerm_resource_group.resourcegroup.name}-network"
Eso significa que a la red virtual se le dará el nombre test-vm-network. Además hacemos lo mismo con la ubicación, el nombre del grupo de recursos y las etiquetas.
A continuación, es hora de establecer la subred en la que colocaremos la VM, usando los mismos métodos usando variables que antes:
resource "azurerm_subnet" "subnet" {
name = "${azurerm_resource_group.resourcegroup.name}-subnet"
resource_group_name = azurerm_resource_group.resourcegroup.name
virtual_network_name = azurerm_virtual_network.network.name
address_prefix = "10.0.2.0/24"
}
Esto crea una subred llamada prueba-vm-subred.
Ahora, definamos la NIC que además usará la VM:
resource "azurerm_network_interface" "vm1-nic" {
name = "vm1-NIC"
location = azurerm_resource_group.resourcegroup.location
resource_group_name = azurerm_resource_group.resourcegroup.name
ip_configuration {
name = "vm1-NicConfiguration"
subnet_id = "${azurerm_subnet.subnet.id}"
private_ip_address_allocation = "static"
private_ip_address = "10.0.2.4"
}
tags = azurerm_resource_group.resourcegroup.tags
}
Para este caso, usaremos una dirección IP estática, refiriéndonos a la subred usando una variable.
Y, por último, pero no menos importante, la definición de la propia máquina virtual:
resource "azurerm_virtual_machine" "vm-1" {
name = "vm1"
location = "${azurerm_resource_group.resourcegroup.location}"
resource_group_name = "${azurerm_resource_group.resourcegroup.name}"
network_interface_ids = ["${azurerm_network_interface.vm1-nic.id}"]
vm_size = "Standard_B1ms"
delete_os_disk_on_termination = true
storage_image_reference {
publisher = "MicrosoftWindowsServer"
offer = "WindowsServer"
sku = "2019-Datacenter"
version = "latest"
}
storage_os_disk {
name = "vm1-osdisk"
caching = "ReadWrite"
create_option = "FromImage"
managed_disk_type = "Standard_LRS"
}
os_profile {
computer_name = "vm-1"
admin_username = "demoadmin"
admin_password = "$om3s3cretPassWord"
}
os_profile_windows_config {
enable_automatic_upgrades = "true"
provision_vm_agent = "true"
}
tags = azurerm_resource_group.resourcegroup.tags
}
El código anterior proporcionará una máquina virtual de Azure que ejecute Windows Server 2019, usando los recursos que definimos previamente. Tendrá un administrador con el nombre de usuario «demoadmin» que tiene la contraseña “$ Om3s3cretPassWord”. El resto de los parámetros se explican por sí mismos, y puede hallar muchos más en los Documentación de Terraform AzureRM.
Ahora, todo lo que queda es salvar el .tf-file implementando esta plantilla en Azure usando TerraForm!
Iniciar e poner en práctica con TerraForm
Ahora que tenemos la plantilla en orden, abre una terminal y ve al directorio en el que guardaste la .tf-archivo a:
cd c:tempterraform
Ahora debemos iniciar TerraForm. Esto descargará el módulo de recursos para AzureRM y buscará errores en el .tf-expediente:
Una vez finalizada la inicialización, está listo para aplicar la plantilla ejecutando terraform apply
.
terraform apply
TerraForm ahora creará un nuevo grupo de recursos en Azure, redes, subredes y, en resumen, la propia máquina virtual. El estado y todos los recursos que ha creado se almacenan en el .terraform carpeta de su directorio actual. Por eso, ¡no elimine esa carpeta si desea borrar los recursos limpiamente más adelante!
Una vez que haya terminado con su máquina virtual de prueba y desee destruirla, simplemente ejecute:
terraform destroy
Esto eliminará todos los discos, nics, subredes, grupos de recursos y demás que creó al ejecutar terraform apply
, y no tiene que preocuparse por olvidarse de borrar los fragmentos que quedan en términos de recursos de Azure.
Conclusión
Utilizar TerraForm solo para tareas menores como esta es increíblemente ordenado. Demuestra que no es necesario tener una Infraestructura como código (IaC) absolutamente implementada para usarla de manera productiva. Además reduce el costo al borrar los recursos no utilizados en Azure. Con suerte, esto ha demostrado ser de utilidad para usted, ¡e inclusive comenzó su viaje hacia IaC!