Fase 2.2
init → plan → apply

Workflow · init → plan → apply

El ciclo de trabajo con OpenTofu se reduce a tres comandos. Cada uno tiene un propósito claro y un momento específico en el que se ejecuta. Entender este flujo es entender cómo funciona la infraestructura como código declarativa.

01

Los Tres Comandos

Tres comandos cubren el 90% del trabajo diario con OpenTofu. El orden es fijo: init una vez, plan cada vez que se modifica código, apply para materializar los cambios.

1

tofu init

Primera vez o al cambiar providers

Descarga los providers declarados en el bloque required_providers. Crea el directorio .terraform/ con los binarios y un lock file (.terraform.lock.hcl) que fija las versiones exactas. Solo se ejecuta una vez al clonar el repo o al agregar un provider nuevo.

tofu/ tofu init
2

tofu plan

Cada vez que se modifican archivos .tf

Compara el estado deseado (archivos .tf) con el estado real (terraform.tfstate). Muestra un diff legible de qué recursos se van a crear (+), modificar (~) o destruir (-). El plan es de solo lectura — no modifica nada. Es la oportunidad de revisar cambios antes de aplicarlos.

tofu/ tofu plan
3

tofu apply

Después de revisar el plan

Aplica el plan generado por tofu plan. Pide confirmación interactiva (yes). Crea, modifica o destruye recursos para que el estado real del cluster coincida con el declarado en los archivos .tf. Actualiza terraform.tfstate con los IDs y metadata de los recursos creados.

tofu/ tofu apply
02

Paso 1: tofu init

El primer comando que se ejecuta en un proyecto OpenTofu. Descarga los providers, crea el directorio de trabajo y genera el lock file. Sin init, ningún otro comando funciona.

tofu init
$cd tofu && tofu init
Initializing the backend...
Initializing provider plugins...
- Finding hashicorp/kubernetes versions matching "~> 2.30"...
- Installing hashicorp/kubernetes v2.30.0...
- Installed hashicorp/kubernetes v2.30.0 (signed, key ID ...)
OpenTofu has been successfully initialized!
¿Cuándo volver a ejecutar init? Solo cuando se agrega un provider nuevo, se cambia la versión de un provider existente, o se clona el repo en una máquina nueva. El directorio .terraform/ está en .gitignore — cada desarrollador ejecuta init localmente.
03

Paso 2: tofu plan

El comando más importante del workflow. Compara el estado deseado contra el real y muestra exactamente qué va a cambiar. Ejecutar plan antes de apply no es opcional — es la práctica que evita destruir recursos por error.

tofu plan
$tofu plan
OpenTofu used the selected providers to generate the following execution plan.
Resource actions are indicated with the following symbols:
+ create
OpenTofu will perform the following actions:
# kubernetes_namespace.aiops will be created
+ resource "kubernetes_namespace" "aiops" {
+ id = (known after apply)
+ metadata {
+ name = "aiops"
+ labels = {
+ "app.kubernetes.io/part-of" = "aiops-lab"
+ "managed-by" = "opentofu"
}
}
}
# kubernetes_config_map.prometheus will be created
+ resource "kubernetes_config_map" "prometheus" {
+ data = {
+ "alert_rules.yml" = (sensitive value)
+ "prometheus.yml" = (sensitive value)
}
}
# kubernetes_config_map.grafana will be created
+ resource "kubernetes_config_map" "grafana" {
+ data = {
+ "datasources.yml" = (sensitive value)
}
}
Plan: 3 to add, 0 to change, 0 to destroy.
Atención al símbolo - (destroy). Si plan muestra recursos con - (menos), significa que OpenTofu va a destruirlos. Esto puede pasar si un recurso fue comentado o eliminado de los archivos .tf. Revisar siempre el plan completo antes de confirmar el apply.
04

Paso 3: tofu apply

El comando que materializa los cambios. Pide confirmación explícita (escribir "yes") y luego crea, modifica o destruye los recursos necesarios para alinear el estado real con el deseado.

tofu apply
$tofu apply
Do you want to perform these actions?
OpenTofu will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value: yes
kubernetes_namespace.aiops: Creating...
kubernetes_namespace.aiops: Creation complete after 1s
kubernetes_config_map.prometheus: Creating...
kubernetes_config_map.prometheus: Creation complete after 0s
kubernetes_config_map.grafana: Creating...
kubernetes_config_map.grafana: Creation complete after 0s
Apply complete! Resources: 3 added, 0 changed, 0 destroyed.
Outputs:
namespace_name = "aiops"
prometheus_configmap_name = "prometheus-config"
grafana_configmap_name = "grafana-datasources"
Skip de confirmación. Para entornos de CI/CD donde no hay un humano para escribir yes, se usa tofu apply -auto-approve. En el lab local, la confirmación manual es la opción más segura.
05

Comandos Adicionales

Más allá de init → plan → apply, hay tres comandos útiles para el día a día. No se usan en cada ciclo, pero son esenciales cuando se necesitan.

tofu destroy

Para limpiar el cluster completamente

El inverso de apply. Destruye todos los recursos gestionados por este stack de OpenTofu. Útil para limpiar el cluster sin dejar recursos huérfanos. Pide confirmación interactiva.

tofu/ tofu destroy

tofu state list

Para inspeccionar el estado actual

Lista todos los recursos que OpenTofu está gestionando actualmente según el state file. Útil para verificar qué recursos existen sin tener que aplicar cambios.

tofu/ tofu state list

tofu output

Después de apply, para obtener valores generados

Muestra los valores de los outputs definidos en outputs.tf. Después de un apply, permite consultar nombres de recursos, IPs, OCIDs sin necesidad de abrir la consola de Kubernetes o OCI.

tofu/ tofu output
06

Archivos Generados por OpenTofu

OpenTofu crea y mantiene varios archivos en el directorio de trabajo. Cada uno tiene un propósito específico y reglas claras sobre si se commitea o se ignora.

.terraform/
Directorio generado

Contiene los binarios de los providers descargados. Se ignora en .gitignore — no se commitea.

.terraform.lock.hcl
Lock file

Fija las versiones exactas de los providers y sus checksums. Se commitea para garantizar builds reproducibles entre máquinas.

terraform.tfstate
State file

Mapeo entre recursos declarados en .tf y recursos reales en el provider. Contiene IDs, metadata y dependencias. Sin este archivo, OpenTofu no sabe qué recursos gestiona.

terraform.tfstate.backup
Backup del state

Copia del state anterior. OpenTofu lo crea automáticamente antes de cada apply. Si algo sale mal, se puede restaurar.

El state file NUNCA se edita manualmente. terraform.tfstate es JSON generado por OpenTofu. Editarlo a mano rompe la consistencia entre el estado deseado y el real. Si se necesita modificar el state, se usa tofu state mv o tofu import. Si el state se corrompe, se restaura desde terraform.tfstate.backup.
07

Mismo Workflow, Distinto Provider

El workflow init → plan → apply es idéntico para el provider de OCI. La única diferencia es el directorio de trabajo y que las variables sensibles (tenancy_ocid, fingerprint) se pasan via terraform.tfvars o variables de entorno.

Stack Local
tofu/
cd tofu tofu init tofu plan tofu apply
Stack OCI
tofu/oracle/
cd tofu/oracle tofu init tofu plan tofu apply

Los dos stacks son independientes. Cada uno tiene su propio state file, sus propios providers y sus propias variables. Se pueden aplicar en cualquier orden — no hay dependencia entre ellos. El stack local se usa en el lab, el stack OCI se usa en la Fase 9 para la migración a Oracle Cloud.

Siguiente: IaC vs Config Management

Con el workflow dominado, la última página de la Fase 2 profundiza en la diferencia conceptual entre Infrastructure as Code (OpenTofu) y Configuration Management (Ansible) — y por qué el proyecto usa ambos.

IaC vs Config