¿Te resulta más fácil leer con fondo crema, un tono de color, más contraste o un texto más grande? Elige tus colores y tu texto una sola vez, para todas las páginas.

Lección gratuita

Variables, count y for_each en OpenTofu

Después de esta lección: Puedo crear varios recursos a partir de una variable con count o con foreach.

Lección de 55 min14 comandosLaboratorio de OpenTofu: la infraestructura como código, con plan, apply y estado, en una VM

Varias copias de un recurso con una variable

Una variable de OpenTofu es un valor que cambias sin tocar el resto del archivo. Con count y for_each creas varias copias de un recurso a partir de ella. Así describes tres salas de estudio o treinta con las mismas líneas.

Una biblioteca de Valencia abre una sala nueva cada curso. Si cada sala fuera un bloque copiado y pegado, el archivo crecería sin control.

Al final de esta lección

Nota

Puedo crear varios recursos a partir de una variable con count o con for_each.

Palabras clave

PalabraQué significaEjemplo
Variableun valor con nombre que puedes cambiar desde fueravar.ciudad
Salidaun valor que OpenTofu muestra al terminaroutput
Funciónuna herramienta del lenguaje que calcula un valorformat
countcrea tantas copias como diga un número
for_eachcrea una copia por cada elemento de un conjunto
Direcciónel nombre único de cada copiaaula[0]

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Una variable es un valor que puedes cambiar

Un bloque variable declara su tipo y un valor por defecto. Se usa escribiendo var. delante del nombre. Un bloque output muestra un valor al final del apply.

La función format rellena un texto: %s es el sitio de un texto. Con un proveedor real ejecutarías antes tofu init; aquí no hace falta, porque no hay nada que descargar. En printf el signo % es especial, y por eso se escribe dos veces.

Crea otra carpeta de trabajo

Comando
mkdir -p ~/campus-iac

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Entra en ella

Comando
cd ~/campus-iac

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Escribe una variable y una salida

Comando
printf 'variable "ciudad" {\n  type    = string\n  default = "Sevilla"\n}\n\noutput "saludo" {\n  value = format("Hola desde %%s", var.ciudad)\n}\n' > main.tf

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Aplica con el valor por defecto

Comando
tofu apply -auto-approve -no-color

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Aplica con otro valor, solo esta vez

Comando
tofu apply -auto-approve -no-color -var ciudad=Valencia | tail -n 2

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Un error frecuente

Advertencia

Mucha gente cree que -var ciudad=Valencia cambia el valor por defecto del archivo. No lo cambia. El valor vale solo para esa ejecución, y el archivo sigue diciendo Sevilla. Para cambiarlo para siempre, edita el archivo.

Las funciones se prueban en la consola

OpenTofu trae funciones para trabajar con textos y listas. join une una lista con un separador. length cuenta los elementos. upper pone un texto en mayúsculas.

tofu console es una consola para probarlas, pero espera que escribas. Para no esperar, las órdenes siguientes le pasan la expresión con echo. La carpeta de la consola está vacía a propósito.

Crea una carpeta vacía

Comando
mkdir -p ~/consola

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Entra en la carpeta vacía

Comando
cd ~/consola

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Une una lista con la función join

Comando
echo 'join(" y ", ["pan", "queso"])' | tofu console

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Cuenta los elementos con length

Comando
echo 'length(["a", "b", "c"])' | tofu console

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

count numera copias y for_each las nombra

Con count = 3 obtienes tres copias, numeradas desde 0, y dentro del bloque count.index dice cuál eres. Es útil para cosas idénticas.

Con for_each sobre un conjunto obtienes una copia por elemento, y each.key es el elemento. Su dirección lleva el nombre entre comillas, como equipo["alma"]. Es mejor para cosas con identidad propia.

Crea la carpeta del proyecto

Comando
mkdir -p ~/varias

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Entra en ella

Comando
cd ~/varias

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Escribe un count y un for_each

Comando
printf 'resource "terraform_data" "aula" {\n  count = 3\n  input = format("aula %%d", count.index + 1)\n}\n\nresource "terraform_data" "equipo" {\n  for_each = toset(["bruno", "alma"])\n  input    = format("portatil de %%s", each.key)\n}\n' > main.tf

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Aplica y mira la última línea

Comando
tofu apply -auto-approve -no-color | tail -n 1

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Lista las cinco direcciones

Comando
tofu state list

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Qué crea cada bloque

BloqueCopiasDireccionesInput de cada una
count = 33aula[0], aula[1], aula[2]aula 1, aula 2, aula 3
for_each con alma y bruno2equipo["alma"], equipo["bruno"]portatil de alma, portatil de bruno
for_each con alma dos veces1equipo["alma"]Un conjunto no repite elementos

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Para ir más lejos

Cambia count = 3 por count = 2 en ~/varias/main.tf y ejecuta tofu plan. Antes de mirar, di qué dirección desaparece.

Después cambia el conjunto de for_each y quita "alma". Compara qué direcciones se destruyen en cada caso: la lección siguiente enseña a leer ese plan.

Sobre este laboratorio y su código: Laboratorio de OpenTofu: la infraestructura como código, con plan, apply y estado, en una VM

¿Enseñas a una clase? Asigna este módulo a tus alumnos con guía del profesor, tareas con corrección automática y un laboratorio para cada alumno.