Introducción
Imagine que va a pedir un café. Si el menú solo dice «Café», es posible que siempre reciba café negro. Pero si el menú incluye opciones como «Tamaño» o «Tipo de leche», puede personalizar su pedido sin que el barista tenga que aprender una receta nueva para cada combinación.
En Terraform, las variables hacen que las configuraciones sean reutilizables, ya que permiten cambiar los valores de entrada sin reescribir todo el archivo.
Los valores de salida permiten que Terraform informe valores importantes resultantes, como ID, nombres o direcciones. Juntos, las variables y los valores de salida hacen que las configuraciones de Terraform sean más modulares y prácticas.
Al finalizar este laboratorio, tendrá una configuración flexible de Terraform capaz de crear contenedores con distintos nombres según sea necesario.
Las variables separan la lógica de configuración de los datos específicos del entorno. Los valores de salida hacen lo contrario: publican valores resultantes útiles para el usuario o para procesos de automatización posteriores.
Crear el archivo de variables
Los buenos chefs organizan los ingredientes antes de empezar a cocinar. En Terraform, se recomienda mantener las opciones personalizadas (las variables) en un archivo separado de la receta principal.
El nombre estándar de este archivo es variables.tf. Crear este archivo no cambia el funcionamiento de Terraform: Terraform lee todos los archivos .tf de la carpeta como si fueran un solo libro grande, pero esta separación ayuda a mantener todo organizado.
Este principio de organización es importante en la infraestructura como código (IaC), porque las configuraciones reales crecen rápidamente. Separar claramente las variables, los recursos y los valores de salida facilita mucho el mantenimiento posterior.
Vaya a la carpeta del proyecto y cree este archivo.
cd ~/project
touch variables.tf
Ahora tiene un archivo vacío listo para incluir las definiciones. En el siguiente paso, añadirá contenido al archivo.
Definir una variable
Ahora debe declarar qué opciones están disponibles. Es como añadir un campo «Nombre» a un formulario de pedido.
Abra variables.tf con nano:
nano variables.tf
Añada este bloque. Indica a Terraform lo siguiente: «Existe una opción llamada container_name, acepta texto (string) y, si el usuario no especifica ningún valor, debe llamarse ExampleNginxContainer».
variable "container_name" {
description = "Value of the name for the Docker container"
type = string
default = "ExampleNginxContainer"
}
Guarde el archivo y salga de nano (Ctrl+O, Enter, Ctrl+X).
Ahora que existe el campo del formulario, debe utilizarlo en la receta. Creará un archivo main.tf que use esta variable.
Cree main.tf:
nano main.tf
Pegue el código siguiente. Preste atención a name = var.container_name. Así se conecta la variable con la configuración.
terraform {
required_providers {
docker = {
source = "kreuzwerker/docker"
version = "~> 3.0.1"
}
}
}
provider "docker" {}
resource "docker_image" "nginx" {
name = "nginx:latest"
keep_locally = false
}
resource "docker_container" "nginx" {
image = docker_image.nginx.image_id
name = var.container_name
ports {
internal = 80
external = 8000
}
}
Recuerde guardar el archivo y salir de nano.
Al utilizar var.container_name, le indica a Terraform lo siguiente: «No escriba un nombre fijo; busque el valor que tenga la variable container_name y utilícelo».
Definir valores de salida
Cuando compra algo, recibe un recibo. En Terraform, los valores de salida funcionan como ese recibo: muestran información importante sobre lo que se acaba de crear.
Esto resulta muy útil para obtener información que no podía conocer antes de crear el recurso, como un ID aleatorio asignado por el sistema o una dirección IP pública.
Los valores de salida son especialmente útiles cuando una parte de la infraestructura debe proporcionar información a un operador, a otro módulo de Terraform o a un paso posterior de automatización.
Cree un archivo llamado outputs.tf para organizar estos valores devueltos. Ábralo con nano:
nano outputs.tf
Añada este bloque. Indica a Terraform lo siguiente: «Cuando termine, muestre el ID del contenedor de nginx».
output "container_id" {
description = "ID of the Docker container"
value = docker_container.nginx.id
}
Guarde el archivo y salga de nano.
Ahora ejecute el código.
Primero, inicialice el proyecto para descargar el proveedor de Docker:
terraform init
A continuación, aplique la configuración. No especificará un nombre para el contenedor, por lo que se utilizará el valor predeterminado (ExampleNginxContainer). Usará -auto-approve para omitir la confirmación «yes» y ahorrar tiempo.
terraform apply -auto-approve
Observe la parte inferior de la salida. Debe aparecer Outputs:, seguido de container_id.
Sobrescribir variables
La verdadera ventaja de las variables es que puede cambiarlas sin reescribir el código. Imagine que quiere iniciar un segundo contenedor con un nombre diferente. No necesita editar main.tf.
Solo tiene que indicarle a Terraform que sobrescriba el valor predeterminado mediante la opción -var. Es como decirle al barista: «En realidad, prepárelo grande».
Ejecute este comando:
terraform apply -var="container_name=MyDynamicContainer" -auto-approve
Observe atentamente la salida. Terraform mostrará: docker_container.nginx must be replaced.
¿Por qué? En Docker, no es fácil cambiar el nombre de un contenedor en ejecución. Para cambiar el nombre, Terraform determina que debe destruir el contenedor antiguo (-) y crear uno nuevo (+) con el nombre nuevo. Este es un principio fundamental de la infraestructura inmutable: se reemplazan los elementos en lugar de modificarlos parcialmente.
Verifique que el nuevo contenedor esté en ejecución:
docker ps --format "{{.Names}}"
Debe aparecer MyDynamicContainer.
Resumen
¡Felicitaciones! Ha conseguido que su código de Terraform sea dinámico.
En este laboratorio aprendió lo siguiente:
- Variables: cómo utilizar
variables.tfpara crear «campos de formulario» flexibles en el código. - Referencia: cómo utilizar
var.variable_namepara insertar esos valores en la configuración principal. - Valores de salida: cómo utilizar
outputs.tfpara mostrar datos importantes (el «recibo») después de una ejecución. - Sobrescrituras: cómo introducir valores nuevos desde la línea de comandos mediante
-var, lo que permite reutilizar el mismo código en distintas situaciones.



