¿Cómo comunicar módulos en Terraform para desplegar una máquina virtual?
Terraform facilita la autogestión de infraestructuras en la nube. Sin embargo, al crear múltiples módulos, es fundamental garantizar que los componentes puedan comunicarse entre sí. En este artículo, te mostraremos cómo compartir propiedades entre módulos en Terraform, especialmente cuando despliegas una máquina virtual. Este proceso optimiza tu infraestructura y te ayuda a gestionar recursos de manera eficiente.
¿Cómo extraer valores de salida de un módulo?
Para compartir variables entre módulos, necesitas definir valores de salida en Terraform. Los valores de salida permiten que los datos de un módulo estén disponibles para otros módulos. Aquí te explicamos cómo hacerlo a través de un ejemplo de implementación:
Crear archivos de salida: Dentro del directorio del módulo de red (bnet), crea un archivo para definir los valores de salida. Por ejemplo:
Exportar el ID del grupo de seguridad de red: Si necesitas utilizar el ID de un grupo de seguridad de red desde otro módulo, repite el procedimiento en el módulo correspondiente:
¿Cómo validar y aplicar la infraestructura en Terraform?
Después de haber configurado y conectado todos los módulos necesarios, debes validar los cambios y aplicarlos. Sigue estos pasos para garantizar que tu infraestructura se implemente correctamente:
Inicializar los módulos:
Usa el comando terraform init para descargar e instalar los módulos y configuraciones necesarias.
Planificar la infraestructura:
Ejecuta terraform plan -out=plan.out para revisar los componentes que se crearán, modificando la infraestructura.
Formatear código:
Asegúrate de mantener tu código estructurado mediante terraform fmt --recursive.
Aplicar cambios:
Ejecuta terraform apply plan.out para desplegar los recursos descritos en tu plan.
Verificar la implementación:
Revisa el portal de Azure para confirmar que los recursos se han desplegado correctamente. Descarga el archivo RDP y realiza las pruebas necesarias.
Limpiar recursos:
Cuando hayas terminado las pruebas, usa terraform destroy para eliminar los recursos y evitar costos adicionales en tu suscripción de Azure.
La gestión eficiente de infraestructuras con múltiples módulos en Terraform te permite no solo reducir la duplicidad de código sino también mantener un entorno limpio y organizado. Continúa explorando las posibilidades de Terraform y optimiza aún más tus implementaciones en la nube. ¡Mucho éxito!
Antes de esta clase entendía los output como solo para imprimir los valores después de creados los recursos. Pero ya dentro de los modules, funcionan como un export, para que pueda exportar valores que otros módulos que necesiten.
Cada módulo puede tener sus propias variables, pero el archivo de variables de la raíz, debe tener las variables de todos los módulos.
Cada módulo debe tener los 3 archivos: main.tf, variables.tf, output.tf.
Al principio es un poco confuso, pero es más de ser organizado. Los protagonistas son las variables.
Mi clase en github:
Esta fue la organización que hice para AWS con EC2 instance:
07-modulos/├── 📄 provider.tf # Configuración de Terraform y provider
├── 📄 variables.tf # Variables de entrada del root module
├── 📄 locals.tf # Valores calculados
├── 📄 main.tf # Orquestación de los tres módulos
├── 📄 outputs.tf # Outputs exportados al usuario
├── 📄 terraform.tfvars # Valoresreales(key_name, etc.)├── 📄 terraform.tfvars.example # Plantilla de ejemplo
└── 📦 modules/ ├── 🌐 networking/ # VPC,Subnet,InternetGateway, etc.│ ├── main.tf │ ├── variables.tf │ └── outputs.tf ├── 🔒 security/ # SecurityGroups │ ├── main.tf │ ├── variables.tf │ └── outputs.tf └── 💻 compute/ # AMI lookup + instancias EC2 ├── main.tf ├── variables.tf └── outputs.tf
Hay algo que no me hace sentido y es de donde saca los valores de las variables location, resource_group_name, vm_username, vm_password, si no la especificas en ninguna parte al ejecutar tal cual como esta en este ejercicio las solicita, aqui falto configurar adecuadamente estos valores!
Esas variables estan en el archivo terraform.tfvars, si estas usando el repositorio de github para ejecutarlo tal cual, probablemente no vas a ver ese archivo porque esta incluido en .gitignore