Creación de una VM en Azure mediante Terraform con bucles for

by Rackspace Technology Staff

Introducción

Puede crear fácilmente varias máquinas virtuales (VM) en Azure® utilizando Hashicorp® Terraform® con la ayuda de Visual Studio® Code (VS Code).

Esta entrada de blog se centra en la creación masiva de máquinas virtuales en Azure. También hago hincapié en el enfoque de la Infraestructura como Código (IaC). Yo uso VS Code a lo largo de este blog, pero puedes usar tu IDE favorito.

Empezar

Repasé los requisitos generales para crear múltiples VMs en Azure con algún estándar específico o nomenclatura típica. Incluso cuando construimos cosas sobre la marcha, tenemos que vigilarlo todo para mantener nuestros estándares. Y mantener el estándar no es nada fácil, sobre todo porque tenemos que seguir los mismos cánones de nombres para el nombre de la máquina virtual, el disco del sistema operativo, el disco de datos, el nombre de la controladora de interfaz de red (NIC), etc.

IaC nos permite gestionar todos los aspectos del mantenimiento de las normas, incluidas las cosas que construimos en el backend en la superficie real.

He escrito algún código Terraform simple para crear dos VMs en Azure con nombres similares para cada recurso. También utilizo etiquetas, que son una nueva forma de separar las cosas. Así pues, pasemos directamente a la acción y ensuciémonos las manos con Terraform.

La creación de una máquina virtual Azure requiere un grupo de recursos (RG), una red virtual (VNet), una subred, una NIC y la configuración de la máquina virtual. Teniendo todo esto en cuenta, vamos a separar todos los archivos para que sea fácil de entender.

Crear el archivo de grupo de recursos

En primer lugar, tenemos que crear un bloque de código RG en el lenguaje de configuración de Hashicorp (HCL). Vamos a crear dos RGs (uno para la VM y NIC y otro para cosas de red). Como mejor práctica, no recomiendo mantener todo junto. Antes de crear los RGs, define un bloque de proveedor para Terraform, para que entienda que estamos desplegando recursos Azure. Almacene esta información para Terraform en un archivo separado llamado providers.tf:

< entidad-drupal data-align="left" data-embed-button="media_entity_embed" data-entity-embed-display="view_mode:media.full" data-entity-type="media" data-entity-uuid="ffc70d81-8bc0-42e9-b646-2faec089e354" data-langcode="en"> < /drupal-entity>

El código RG, rg.tf:

< entidad-drupal data-align="left" data-embed-button="media_entity_embed" data-entity-embed-display="view_mode:media.full" data-entity-type="media" data-entity-uuid="ffc70d81-8bc0-42e9-b646-2faec089e354" data-langcode="en"> < /drupal-entity>

Crear los archivos VNET y de subred

Ahora, la segunda tarea es crear una VNet y una subred para nuestra VM. El bloque VNet,vnet.tf:

< entidad-drupal data-align="left" data-embed-button="media_entity_embed" data-entity-embed-display="view_mode:media.full" data-entity-type="media" data-entity-uuid="ffc70d81-8bc0-42e9-b646-2faec089e354" data-langcode="en"> < /drupal-entity>

Y el código de subred, subnet.tf

< entidad-drupal data-align="left" data-embed-button="media_entity_embed" data-entity-embed-display="view_mode:media.full" data-entity-type="media" data-entity-uuid="ffc70d81-8bc0-42e9-b646-2faec089e354" data-langcode="en"> < /drupal-entity>

Crear el archivo NIC

Ya casi hemos terminado con las cosas de red excepto la NIC de nuestra VM. Pongamos el código NIC en el RG de la VM. Tenga en cuenta que he hecho referencia a la aplicación RG en resource\_group\_name porque mantener los detalles de NIC en la Red RG no me conviene.

El código NIC: Nic.tf:

< entidad-drupal data-align="left" data-embed-button="media_entity_embed" data-entity-embed-display="view_mode:media.full" data-entity-type="media" data-entity-uuid="ffc70d81-8bc0-42e9-b646-2faec089e354" data-langcode="en"> < /drupal-entity>

Crear el archivo de almacenamiento

Ahora hemos terminado con todas las cosas de red, pero la mayoría de la gente considera que una VM sin la configuración de diagnóstico activada es una mala construcción. ¡Y no quiero que nadie me llame "nuevo constructor"! El código de la cuenta de almacenamiento es sencillo y, al utilizarlo, podemos considerarnos buenos implementadores de Azure.

El archivo Storage account, storage_account.tf:

< entidad-drupal data-align="left" data-embed-button="media_entity_embed" data-entity-embed-display="view_mode:media.full" data-entity-type="media" data-entity-uuid="ffc70d81-8bc0-42e9-b646-2faec089e354" data-langcode="en"> < /drupal-entity>

Crear el archivo VM

Ya tenemos todo listo para el código de la VM, pero recuerda que tenemos que usar los mismos estándares que usamos antes, como el nombre de la VM, el nombre de la NIC, el nombre del disco, etc.

Código final para nuestra VM, vm.tf:

Building GCP  Landing Zones Pic 6
Building GCP Landing Zones Pic 7
  < entidad-drupal data-align="left" data-embed-button="media_entity_embed" data-entity-embed-display="view_mode:media.full" data-entity-type="media" data-entity-uuid="ffc70d81-8bc0-42e9-b646-2faec089e354" data-langcode="en"> < /drupal-entity>

Crear el fichero de variables

Por último, puse algunas cosas en variables como todos los nombres de VM. Puedes poner otros elementos en variables, como RG, VNet y nombres de subred. El uso de variables ayuda cuando se hacen construcciones gigantes.

El archivo de variables, Variable.tf:

< entidad-drupal data-align="left" data-embed-button="media_entity_embed" data-entity-embed-display="view_mode:media.full" data-entity-type="media" data-entity-uuid="ffc70d81-8bc0-42e9-b646-2faec089e354" data-langcode="en"> < /drupal-entity>

Construir las máquinas virtuales

Mi objetivo es crear dos máquinas virtuales utilizando un bucle for. Así, la variable vm_name tiene dos nombres de VM (se pueden añadir múltiples), y la segunda variable es la ubicación en la que quiero desplegar los recursos Azure.

Permítanme compartir cómo mantengo mis estándares intactos: Usé VMName-nic para cada NIC, VMName-Osdisk, y -data1. Todos los recursos como VM, NIC y DISK aparecen con la misma nomenclatura, por lo que podemos entender fácilmente qué recursos pertenecen a qué VM.

Despliegue

Pongámonos manos a la obra y aprendamos a desplegar las máquinas virtuales en Azure. Es hora de hervir los huevos. Para simplificar, utilizo la CLI de Azure para esta tarea en lugar de utilizar un enfoque DevOps adecuado y ejecutar esto a través de una tubería y almacenar los archivos del sitio en algún lugar que no sea nuestro directorio.

Si no tienes la CLI `az` en tu máquina, puedes [instalarla](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli?view=azure-cli-latest).

1. Inicie sesión en Azure: az login

2. Compruebe cuántas suscripciones tenemos para este arrendatario: az account list --output table

3. Establecer la suscripción correcta para nuestro despliegue:

az   account set --subscription "XXXXXX-XXXXXXX-XXXX-XXX"

4. Navegue hasta el directorio donde hemos puesto todos nuestros archivos de código Terraform (utilicé temp para este ejemplo, pero no recomiendo esa ubicación):

cd C:\temp

5. Inicializa Terraform en este directorio:

terraformar init

6. Ejecutar el plan Terraform para comprobar lo que vamos a construir y guardar la salida del plan para su uso posterior mediante la adición de la `-out` bandera en el comando:

plan de terraformación

o

plan de terraformación

7. Ejecute el código Terraform para desplegar y escriba yes en la comprobación de confirmación    o utilice -auto-approve para omitir la confirmación manual:

terraformar aplicar

o

terraformar aplicar

8. Comprueba la máquina virtual que has creado:

    az   vm list -o tabla

Algunos trucos secretos del bucle for

Puedes crear múltiples VMs ejecutando un bucle for de Terraform como se muestra en el siguiente código. El bucle se ejecuta tantas veces como se haya definido la variable (dos veces, en nuestro caso, porque he definido dos nombres de VM en la variable):

for_each = toset(var.vm_name)

 El `cada` objeto:

El bucle for en Terraform tiene un par de claves, clave y valor, pero ambos son generalmente similares.En los bloques de recursos, en los que se establece for_each, puede utilizar reach objetos adicionales en sus expresiones para modificar la configuración de cada instancia.

cada objeto tiene dos atributos:

- each.key: La clave del mapa (o miembro del conjunto) correspondiente a esta instancia.

- each.value: El valor del mapa correspondiente a esta instancia. Si ha proporcionado un conjunto, es lo mismo que each.key.

Puede utilizar el comando Terraform fmt para dar formato al código, como reescribir los archivos de configuración de Terraform para que se ajusten a un formato y estilo canónicos. Este comando aplica un subconjunto de convenciones de estilo del lenguaje Terraform, junto con otros ajustes menores para facilitar la lectura.  

Conclusión

Diviértete usando Terraform para Azure y mantén los estándares con un código sencillo

Más información sobre nuestras soluciones Azure Cloud