Construir una VM de Windows Azure con Terraform: Paso a paso

¿Has creado una máquina virtual de Azure a través del portal de Azure antes? Si es así, ¿cuántos clics te llevó hacerlo? ¿Puedes hacerlo una y otra vez, proporcionando los mismos valores de entrada exactos para asegurarte de cumplir con un estándar específico? Probablemente no. Necesitas automatizar el proceso. ¡Crea máquinas virtuales de Azure con Terraform!

Terraform de Hashicorp es una utilidad que crea infraestructura simple o compleja local o en la nube. Terraform es un único archivo binario que lee archivos de configuración, crea un estado y luego asegura que tu infraestructura se cree y permanezca en ese estado.

En este artículo, aprenderás cómo comenzar con Terraform creando una máquina virtual de Azure. Este tutorial será un excelente ejemplo de Terraform en Azure.

Prerrequisitos

Si deseas seguir este tutorial, asegúrate de tener lo siguiente en su lugar:

A lo largo de los pasos, este tutorial utilizará macOS ejecutando PowerShell Core, aunque el mismo proceso se puede seguir en Windows 10 utilizando PowerShell Core, Windows PowerShell o incluso el símbolo del sistema de Windows.

Instalación de Terraform

Para comenzar, primero deberás descargar Terraform. Hay muchas formas de hacerlo según tus preferencias. Este tutorial está utilizando macOS, por lo que puedes usar HomeBrew ejecutando brew install terraform. También puedes ir directamente a la página de descarga de Terraform o, si estás en Windows, también puedes usar Chocolatey.

¿Sabías que Azure Cloud Shell tiene Terraform preinstalado?

Una vez que hayas descargado Terraform, cópialo a una carpeta en tu ruta y ejecuta terraform. Deberías ver algunas instrucciones de uso como se muestra a continuación. Si ves esto, estás listo para continuar.

Terraform Usage Instructions

Autenticación en Azure

Terraform utiliza proveedores para comunicarse con varios proveedores locales y en la nube. En este caso, debes configurar el proveedor de Azure de Terraform. Suponiendo que tienes instalada la CLI de Azure y ya estás autenticado en Azure, primero debes crear un principal de servicio. Terraform utilizará el principal de servicio para autenticarse y obtener acceso a tu suscripción de Azure.

Crea un principal de servicio

En tu consola, crea un principal de servicio utilizando la CLI de Azure. Para hacerlo:

Primero, encuentra tu ID de suscripción usando el comando az account list a continuación.

> az account list --query [*].[name,id]

Una vez que tengas el ID de suscripción, luego crea un principal de servicio usando la función Contributor con alcance a tu suscripción.

$subscriptionId = 'xxxx-xxxxx-xxxxx'
$sp = az ad sp create-for-rbac --role="Contributor" --scopes="/subscriptions/$subscriptionId" -n TerraformTesting | ConvertFrom-Json

La CLI de Azure se comunicará con Azure y creará una aplicación de Azure AD con una contraseña como se muestra a continuación. Dado que estás asignando la salida que se muestra a continuación a la variable $sp anteriormente, tendrás el appId y la password almacenados en la variable para su uso posterior.

Azure ID Application with a Password

Configurar variables de entorno

Terraform necesita conocer cuatro elementos de configuración diferentes para conectarse correctamente a Azure.

  • El ID de suscripción de Azure
  • El ID de la aplicación de Azure AD del principal de servicio
  • La contraseña del principal de servicio
  • El inquilino de Azure AD

Una forma de proporcionar esta información a Terraform es mediante variables de entorno. Dado que este tutorial se está desarrollando dentro de una consola de PowerShell, puedes configurar estas variables de entorno usando $env:. A continuación, verás cada una de las variables de entorno que Terraform buscará cuando intente conectarse a Azure.

Dado que la salida de az ad sp create-for-rbac se guardó en la variable $sp anteriormente, simplemente puedes hacer referencia a las propiedades en lugar de copiar y pegarlas.

$env:ARM_SUBSCRIPTION_ID = $subscriptionId
$env:ARM_CLIENT_ID = $sp.appId
$env:ARM_CLIENT_SECRET = $sp.password
$env:ARM_TENANT_ID = $sp.tenant

Una vez que hayas definido las variables de entorno, ¡Terraform estará listo para conectarse a Azure!

Crea un archivo de configuración

Todas las configuraciones de Terraform se crean en una sola carpeta típicamente por un nombre de módulo. En este tutorial, no estás creando un módulo pero seguirás la misma práctica.

En tu consola de PowerShell, crea una carpeta llamada TerraformTesting donde quieras y luego cambia a ese directorio.

mkdir TerraformTesting
cd TerraformTesting

A continuación, crea el archivo de configuración main.tf. Aquí es donde se almacenará la configuración para construir la VM de Azure con Terraform. Este es el archivo de configuración que la mayoría llama “principal”. Contiene declaraciones de proveedores y recursos para toda la infraestructura que la configuración administrará.

Si quieres aprender más sobre la sintaxis (HCL), Michael Levan y yo tenemos un excelente capítulo sobre Terraform en nuestro eBook No BS Azure and DevOps.

Crea un nuevo archivo main.tf dentro del directorio Terraformtesting que se vea como el siguiente.

## <https://www.terraform.io/docs/providers/azurerm/index.html>
provider "azurerm" {
  version = "=2.5.0"
  features {}
}

## <https://www.terraform.io/docs/providers/azurerm/r/resource_group.html>
resource "azurerm_resource_group" "rg" {
  name     = "TerraformTesting"
  location = "eastus"
}

## <https://www.terraform.io/docs/providers/azurerm/r/availability_set.html>
resource "azurerm_availability_set" "DemoAset" {
  name                = "example-aset"
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name
}

## <https://www.terraform.io/docs/providers/azurerm/r/virtual_network.html>
resource "azurerm_virtual_network" "vnet" {
  name                = "vNet"
  address_space       = ["10.0.0.0/16"]
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name
}

## <https://www.terraform.io/docs/providers/azurerm/r/subnet.html> 
resource "azurerm_subnet" "subnet" {
  name                 = "internal"
  resource_group_name  = azurerm_resource_group.rg.name
  virtual_network_name = azurerm_virtual_network.vnet.name
  address_prefix       = "10.0.2.0/24"
}

## <https://www.terraform.io/docs/providers/azurerm/r/network_interface.html>
resource "azurerm_network_interface" "example" {
  name                = "example-nic"
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name

  ip_configuration {
    name                          = "internal"
    subnet_id                     = azurerm_subnet.subnet.id
    private_ip_address_allocation = "Dynamic"
  }
}

## <https://www.terraform.io/docs/providers/azurerm/r/windows_virtual_machine.html>
resource "azurerm_windows_virtual_machine" "example" {
  name                = "example-machine"
  resource_group_name = azurerm_resource_group.rg.name
  location            = azurerm_resource_group.rg.location
  size                = "Standard_F2"
  admin_username      = "adminuser"
  admin_password      = "P@$$w0rd1234!"
  availability_set_id = azurerm_availability_set.DemoAset.id
  network_interface_ids = [
    azurerm_network_interface.example.id,
  ]

  os_disk {
    caching              = "ReadWrite"
    storage_account_type = "Standard_LRS"
  }

  source_image_reference {
    publisher = "MicrosoftWindowsServer"
    offer     = "WindowsServer"
    sku       = "2016-Datacenter"
    version   = "latest"
  }
}

Inicializar Terraform

Terraform necesita saber qué tipo de proveedores utilizará una vez que intente crear recursos. Debe saber esto de antemano porque descarga estos proveedores en la misma carpeta en la que está trabajando.

Descargue el proveedor de recursos azurerm según se define en el archivo de configuración principal ejecutando terraform init. Una vez que lo haga, debería ver una salida similar a la siguiente.

Downloading the azurerm

Validar la configuración

La configuración que creaste puede que no sea perfecta. Lo sé, difícil de creer, ¿verdad? Terraform necesita validar la configuración en busca de errores de sintaxis. Para hacer eso, ejecuta el comando terraform plan. Este comando lee los archivos de configuración en el directorio y muestra cualquier error.

Asegúrate de corregir cualquier error que muestre el terraform plan antes de intentar aprovisionar la infraestructura de verdad.

Construye la VM de Azure con Terraform

Finalmente, es hora de construir la VM de Azure ejecutando terraform apply. Cuando ejecutas terraform apply, Terraform lee cualquier archivo de configuración que tengas en el directorio y te pide confirmación. Una vez que escribas “yes”, se conectará a Azure y comenzará a construir la VM y todos los recursos asociados.

Buildign Azure VM

Si ves el texto brillante y reluciente en verde Apply complete! en la parte inferior, ¡Terraform ha construido los recursos exitosamente!

Limpieza

Dado que esto fue solo una demostración y probablemente no planeas mantener esta VM, asegúrate de hacer un favor a ti mismo y eliminar todo lo que has hecho.

Creaste un principal de servicio para que Terraform se autentique en Azure. Puedes eliminarlo con un comando az ad sp delete a continuación.

$spId = ((az ad sp list --all | ConvertFrom-Json) | Where-Object { '<http://TerraformTesting>' -in $_.serviceprincipalnames }).objectId
az ad sp delete --id $spId

A continuación, elimina la VM de Azure que acabas de crear y todos los demás recursos en el archivo de configuración utilizando terraform destroy. Si deseas validar la configuración y probar qué sucedería si ejecutaras terraform destroy, también puedes ejecutar terraform plan -destroy.

Conclusión

Terraform es una gran herramienta gratuita para construir infraestructura en diferentes áreas. Aprender la sintaxis de HCL es la parte más difícil de Terraform, pero honestamente, HCL es un lenguaje intuitivo. Si estás pensando en usar una herramienta como Terraform o plantillas ARM, por ejemplo, ¡aprende Terraform!

Terraform es una herramienta popular en la industria ahora, con un gran apoyo de la comunidad y mucha gente dispuesta a ayudar.

Source:
https://adamtheautomator.com/terraform-azure-vm/