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
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Variable | un valor con nombre que puedes cambiar desde fuera | var.ciudad |
| Salida | un valor que OpenTofu muestra al terminar | output |
| Función | una herramienta del lenguaje que calcula un valor | format |
| count | crea tantas copias como diga un número | |
| for_each | crea una copia por cada elemento de un conjunto | |
| Dirección | el nombre único de cada copia | aula[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
mkdir -p ~/campus-iacSe 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
cd ~/campus-iacSe 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
printf 'variable "ciudad" {\n type = string\n default = "Sevilla"\n}\n\noutput "saludo" {\n value = format("Hola desde %%s", var.ciudad)\n}\n' > main.tfSe 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
tofu apply -auto-approve -no-colorSe 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
tofu apply -auto-approve -no-color -var ciudad=Valencia | tail -n 2Se 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
mkdir -p ~/consolaSe 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
cd ~/consolaSe 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
echo 'join(" y ", ["pan", "queso"])' | tofu consoleSe 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
echo 'length(["a", "b", "c"])' | tofu consoleSe 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
mkdir -p ~/variasSe 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
cd ~/variasSe 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
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.tfSe 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
tofu apply -auto-approve -no-color | tail -n 1Se 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
tofu state listSe 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
| Bloque | Copias | Direcciones | Input de cada una |
|---|---|---|---|
| count = 3 | 3 | aula[0], aula[1], aula[2] | aula 1, aula 2, aula 3 |
| for_each con alma y bruno | 2 | equipo["alma"], equipo["bruno"] | portatil de alma, portatil de bruno |
| for_each con alma dos veces | 1 | equipo["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.