Saltar al contenido

Lección 11 de 20 · Lectura y práctica

Uso de Variables y Outputs para Configuraciones Dinámicas

Concepto claveLas variables y outputs en Terraform son mecanismos fundamentales para crear configuraciones dinámicas y reutilizables. Piensa en las variables como los parámetros ajustables de una receta: en lugar de tener una.

Del concepto a la práctica

Taller de esta lección

Las variables permiten cambiar comportamiento sin copiar configuraciones; los outputs comunican resultados a personas o módulos. Un buen diseño diferencia valores de entrada, valores derivados y valores sensibles. Para tres entornos, el código debe permanecer igual mientras cambian tamaño, nombre y rangos autorizados.

Ejemplo resuelto

Define instance_count=2, environment=staging y allowed_admin_cidr=192.0.2.0/24. Un local construye el nombre reservas-staging y un output expone el nombre del balanceador, no la contraseña ni el contenido del estado.

Pruébalo

  1. Declara tipos y descripciones para las variables.

  2. Asigna valores en un archivo de variables no sensible o mediante el entorno autorizado.

  3. Usa un local para derivar nombres consistentes.

  4. Ejecuta plan con dev y staging y compara solo las diferencias esperadas.

Error frecuente: publicar como output un atributo sensible porque resulta cómodo para depurar. Corrección: retirar la salida o marcarla sensible y usar un canal autorizado para la comprobación.

Ejercicio: prepara una tabla con environment=dev y staging, instance_count=1 y 2, y los nombres derivados.

Comprueba tu resultado

reservas-dev y reservas-staging; si instance_count alimenta cómputo, cambiar 1 a 2 añade capacidad y no solo cambia el nombre.

Diferencias esperadas y entradas validadas

La tabla del borrador cambia dos entradas: environment dev→staging e instance_count1→2. Por eso, si count se conecta a un recurso, puede añadir una instancia además de cambiar nombres/etiquetas; «ninguna otra diferencia» solo era cierto si no cambiara cantidad. El nombre calculado sigue reservas-dev/reservas-staging. Declara explícitamente si el ejercicio solo calcula outputs o también crea cómputo.

hcl
variable "instance_count" {
  type = number
  default = 1
  validation {
    condition = var.instance_count >= 1 && var.instance_count <= 4 && floor(var.instance_count) == var.instance_count
    error_message = "Cantidad entera entre 1 y 4."
  }
}

1 y2 cumplen;0,1.5 y5 no. Usa la variable environment validada de la lección2 para local.nombre="reservas-${var.environment}" dentro de locals. Variables sin default requieren valor; tfvars contiene datos y no es un almacén de secretos por su extensión. Revisa precedencia cuando combinas TF_VAR_, ficheros auto.tfvars y flags -var/-var-file; la última entrada de mayor prioridad puede explicar un plan inesperado.

Outputs de módulos son interfaces, no consulta segura universal: una salida sensitive oculta presentación normal, pero mecanismos de salida raw/JSON pueden revelar el valor. No la copies al recibo de revisión. Una IP de una instancia privada puede ser null como public_ip, y ello no demuestra fallo de creación.

Diagrama de decisión con ramas Sí y No y un bucle que procesa cada elemento de una lista.
CursaloMapa de práctica
Cómo avanza un programa

Una condición decide qué camino ejecuta el programa. Un bucle repite una operación mientras queden elementos, y termina cuando la lista se agota. Separar ambas ideas ayuda a seguir el flujo y comprobar casos límite.

Ver la infografía en tamaño completo ↗

Concepto clave

Las variables y outputs en Terraform son mecanismos fundamentales para crear configuraciones dinámicas y reutilizables. Piensa en las variables como los parámetros ajustables de una receta: en lugar de tener una receta fija para "pastel de chocolate", tienes una plantilla donde puedes especificar el tipo de harina, la cantidad de azúcar o el tipo de chocolate. Los outputs son como la etiqueta nutricional final del pastel: información valiosa que quieres extraer después de la preparación, como las calorías totales o los ingredientes utilizados.

En el contexto de DevOps, las variables te permiten crear un mismo módulo de infraestructura que puede desplegarse en diferentes entornos (desarrollo, staging, producción) simplemente cambiando valores como el tamaño de instancia o el prefijo de nombres. Los outputs te permiten exponer información crítica, como la IP pública de un balanceador de carga o el endpoint de una base de datos, que otros sistemas o equipos pueden consumir. Sin estas herramientas, estarías escribiendo código duplicado para cada variación, lo que va en contra de los principios de IaC.

Cómo funciona en la práctica

El flujo de trabajo típico involucra tres archivos principales: variables.tf (donde defines las variables), main.tf (donde usas esas variables en tus recursos), y outputs.tf (donde defines qué información quieres exportar). Terraform procesa estos archivos en un orden lógico: primero lee las definiciones de variables, luego aplica valores (ya sea desde archivos .tfvars, variables de entorno o prompts interactivos), ejecuta la configuración en main.tf, y finalmente calcula y muestra los outputs.

Por ejemplo, imagina que estás desplegando una instancia EC2 en AWS. En variables.tf, defines una variable para el tipo de instancia. En main.tf, usas var.instance_type para especificar ese tipo en el recurso aws_instance. Al ejecutar terraform apply, puedes pasar un valor como t2.micro para desarrollo o m5.large para producción. Después del despliegue, en outputs.tf, defines un output para la IP pública de la instancia, que puedes usar para conectarte o integrar con otros sistemas.

Codigo en accion

Veamos un ejemplo completo. Primero, el antes: un archivo main.tf con valores hardcodeados que no es reutilizable.

resource "aws_instance" "web" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t2.micro"
  tags = {
    Name = "mi-instancia-fija"
  }
}

Ahora, el despues: una configuración dinámica usando variables y outputs.

# variables.tf
variable "instance_type" {
  description = "Tipo de instancia EC2"
  type        = string
  default     = "t2.micro"
}

variable "environment" {
  description = "Entorno (dev, staging, prod)"
  type        = string
  validation {
    condition     = contains(["dev", "staging", "prod"], var.environment)
    error_message = "El valor debe ser dev, staging o prod."
  }
}

# main.tf
resource "aws_instance" "web" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = var.instance_type
  tags = {
    Name        = "web-${var.environment}"
    Environment = var.environment
  }
}

# outputs.tf
output "instance_id" {
  description = "ID de la instancia EC2 creada"
  value       = aws_instance.web.id
}

output "public_ip" {
  description = "IP pública de la instancia"
  value       = aws_instance.web.public_ip
  sensitive   = false
}

Errores comunes

  • No validar variables: Definir variables sin validación puede llevar a valores incorrectos. Usa bloques validation para restringir entradas, como asegurar que un tamaño de disco sea mayor a 10 GB.
  • Exponer información sensible en outputs: Mostrar contraseñas o claves en outputs sin marcarlas como sensitive = true. Terraform ocultará estos valores en la salida, pero aún estarán en el estado; considera usar secret managers como AWS Secrets Manager.
  • Confusión entre default y required: Si una variable tiene un valor default, no es obligatoria; si no tiene default, debes proporcionar un valor. Planifica según tu caso de uso para evitar errores durante apply.
  • No usar outputs para integraciones: Olvidar definir outputs para recursos que otros módulos o sistemas necesitan, como el ARN de un rol IAM, lo que fuerza a extraer manualmente desde el estado.
  • Hardcodear valores en múltiples lugares: Repetir el mismo valor (como una región de AWS) en varios recursos en lugar de definirlo una vez en una variable y reutilizarlo.

Checklist de dominio

  1. Definir al menos una variable con tipo, descripción y valor por defecto en un archivo variables.tf.
  2. Usar variables en recursos de Terraform, por ejemplo, en un aws_instance o aws_s3_bucket.
  3. Crear un archivo outputs.tf que exponga al menos dos atributos de recursos desplegados.
  4. Aplicar validaciones a variables para restringir valores aceptables.
  5. Ejecutar terraform apply pasando valores de variables mediante un archivo .tfvars.
  6. Consumir outputs de un módulo en otro módulo o en la configuración root.
  7. Marcar outputs sensibles apropiadamente para evitar fugas de información.

Crear un módulo reutilizable para un bucket S3 con variables y outputs

En este ejercicio, crearás un módulo de Terraform para un bucket S3 en AWS que use variables para hacerlo dinámico y outputs para exponer información útil. Sigue estos pasos:

  1. Crea una carpeta llamada s3-module con los archivos variables.tf, main.tf, y outputs.tf.
  2. En variables.tf, define tres variables:
    • bucket_name: tipo string, sin valor por defecto, con una descripción.
    • environment: tipo string, con valor por defecto "dev", y una validación que acepte solo "dev", "staging", o "prod".
    • versioning_enabled: tipo bool, con valor por defecto false.
  3. En main.tf, usa las variables para crear un recurso aws_s3_bucket con las siguientes propiedades:
    • Nombre del bucket: use var.bucket_name con un sufijo del entorno, por ejemplo, ${var.bucket_name}-${var.environment}.
    • Habilitar versioning basado en var.versioning_enabled.
    • Agregar tags que incluyan el entorno.
  4. En outputs.tf, define dos outputs:
    • bucket_arn: el ARN del bucket creado.
    • bucket_domain_name: el nombre de dominio del bucket.
  5. Desde una configuración root, llama a este módulo pasando valores para las variables y ejecuta terraform apply para desplegarlo.
Pistas
  • Recuerda que los nombres de buckets S3 deben ser únicos globalmente; considera agregar un identificador aleatorio o usar tu cuenta de AWS.
  • Usa el argumento versioning dentro de aws_s3_bucket con un bloque dinámico basado en el valor booleano.
  • Puedes probar el módulo creando un archivo main.tf en otra carpeta que use module para referenciar s3-module.

Evalua tu comprension

Completa el quiz interactivo de arriba para ganar XP.

Sigue con Terraform en AWS: Infraestructura como Código para DevOps

Esta lección forma parte de un curso de Cursalo. Revisa su programa y elige entre la compra individual o el acceso a toda la escuela.

Si ya tenías acceso a este curso, entra con tu cuenta: tus derechos y tu progreso se conservan. No necesitas comprarlo de nuevo.

01 / ELEGIR UNA RUTA

El próximo paso

Aprende IA mientras construyes algo que sí necesitas.

Empieza por el curso inicial o explora el catálogo para encontrar una práctica alineada con tu trabajo.