Gestión del Estado de Terraform

LinuxBeginner
Practicar Ahora

Introducción

Terraform utiliza un archivo de estado (state file) para almacenar información sobre la infraestructura que gestiona. Este archivo de estado es crucial ya que mapea los recursos definidos en sus archivos de configuración con los recursos del mundo real. Al mantener este estado, Terraform puede determinar qué recursos crear, actualizar o destruir.

En este laboratorio, obtendrá experiencia práctica con la gestión del estado de Terraform. Aprenderá a utilizar varios subcomandos de terraform state para inspeccionar el estado actual, listar los recursos gestionados, renombrar un recurso dentro del estado y actualizar el estado para alinearlo con la infraestructura real. Estas son habilidades fundamentales para cualquier usuario de Terraform.

Este es un Guided Lab, que proporciona instrucciones paso a paso para ayudarte a aprender y practicar. Sigue las instrucciones cuidadosamente para completar cada paso y obtener experiencia práctica. Los datos históricos muestran que este es un laboratorio de nivel principiante con una tasa de finalización del 89%. Ha recibido una tasa de reseñas positivas del 91% por parte de los estudiantes.

Visualizar el estado actual con terraform show

En este paso, aprenderá a ver el estado actual utilizando el comando terraform show. Este comando proporciona una salida legible por humanos de los recursos que Terraform está gestionando actualmente, tal como se registra en el archivo de estado. Es una forma segura y de solo lectura para inspeccionar el estado de su infraestructura.

El script de configuración para este laboratorio ya ha inicializado Terraform y creado un recurso, generando un archivo terraform.tfstate. Vamos a inspeccionarlo.

Ejecute el siguiente comando en su terminal:

terraform show

Verá una salida detallada que describe el recurso local_file que Terraform está gestionando.

## local_file.example:
resource "local_file" "example" {
    content              = "This is an example file managed by Terraform."
    content_base64sha256 = "F5EYZhFNzSXdE4CUftwQoDVqvdiufZpVyiLMqyZVOcQ="
    content_base64sha512 = "m1hvaxMuc/EhaKintyI54NSTTJ5yXpqHPCBNoHubF0rvF3JAj36lMj20aPcv21+3/OK+SqkiTlnT/LdvLCwqDA=="
    content_md5          = "a43bdd236c2f0f4d87452ba2ef0867e4"
    content_sha1         = "ec3adcab998872def2df6200fb03992ac6f237a4"
    content_sha256       = "17911866114dcd25dd1380947edc10a0356abdd8ae7d9a55ca22ccab265539c4"
    content_sha512       = "9b586f6b132e73f12168a8a7b72239e0d4934c9e725e9a873c204da07b9b174aef1772408f7ea5323db468f72fdb5fb7fce2be4aa9224e59d3fcb76f2c2c2a0c"
    directory_permission = "0777"
    file_permission      = "0777"
    filename             = "./example.txt"
    id                   = "ec3adcab998872def2df6200fb03992ac6f237a4"
}

Esta salida confirma que Terraform tiene conocimiento de un recurso, local_file.example, y enumera todos sus atributos.

Inspeccionar el archivo de estado terraform.tfstate

En este paso, inspeccionará el archivo de estado sin procesar (raw state file), terraform.tfstate. Si bien terraform show proporciona una vista amigable para el usuario, observar el archivo JSON sin procesar le ayuda a comprender cómo Terraform almacena los datos.

Advertencia: Casi nunca debe editar el archivo terraform.tfstate manualmente. Las modificaciones incorrectas pueden corromper su estado y provocar problemas graves. Solo lo estamos viendo con fines educativos.

Utilice el comando cat para mostrar el contenido del archivo de estado:

cat terraform.tfstate

La salida será un objeto JSON. Contiene metadatos como la versión de Terraform y, lo más importante, una matriz de resources.

{
  "version": 4,
  "terraform_version": "1.13.3",
  "serial": 1,
  "lineage": "2a568739-a81d-ced7-dee1-7a92a1666022",
  "outputs": {},
  "resources": [
    {
      "mode": "managed",
      "type": "local_file",
      "name": "example",
      "provider": "provider[\"registry.terraform.io/hashicorp/local\"]",
      "instances": [
        {
          "schema_version": 0,
          "attributes": {
            "content": "This is an example file managed by Terraform.",
            "content_base64sha256": "...",
            "content_base64sha512": "...",
            "content_md5": "...",
            "content_sha1": "...",
            "content_sha256": "...",
            "content_sha512": "...",
            "directory_permission": "0777",
            "file_permission": "0777",
            "filename": "./example.txt",
            "id": "ec3adcab998872def2df6200fb03992ac6f237a4",
            "sensitive_content": null,
            "source": null
          },
          "sensitive_attributes": [
            [
              {
                "type": "get_attr",
                "value": "sensitive_content"
              }
            ]
          ],
          "identity_schema_version": 0
        }
      ]
    }
  ],
  "check_results": null
}

Estos datos sin procesar son los que Terraform utiliza para crear planes de ejecución (execution plans).

Ejecutar terraform state list para listar recursos

En este paso, utilizará terraform state list para obtener una lista concisa de todos los recursos en el estado. Cuando su infraestructura crezca y tenga docenas o cientos de recursos, terraform show puede ser demasiado prolijo. El comando state list proporciona una lista simple de las direcciones de los recursos, separadas por saltos de línea.

Ejecute el comando en su terminal:

terraform state list

La salida será muy directa, mostrando solo la dirección del recurso que creamos.

local_file.example

Este comando es extremadamente útil para la creación de scripts o para identificar rápidamente la dirección de un recurso específico cuando necesita dirigir otros comandos hacia él.

Usar terraform state mv para renombrar un recurso

En este paso, aprenderá a renombrar un recurso en el archivo de estado utilizando terraform state mv. Esta es una tarea común al refactorizar su código de Terraform. Si renombra un bloque de recurso en su archivo .tf, Terraform pensará que desea destruir el recurso antiguo y crear uno nuevo. El comando state mv le permite actualizar el archivo de estado para que coincida con los cambios de su código, evitando destrucciones y creaciones innecesarias.

Primero, renombraremos el recurso en nuestro archivo de configuración. Abra main.tf con el editor nano:

nano main.tf

Cambie el nombre del recurso de example a example_renamed. El archivo debería verse así:

resource "local_file" "example_renamed" {
  content  = "This is an example file managed by Terraform."
  filename = "${path.module}/example.txt"
}

Presione Ctrl+X, luego Y, y Enter para guardar y salir.

Ahora, ejecute terraform plan para ver lo que Terraform tiene la intención de hacer:

terraform plan

El plan mostrará que Terraform quiere destruir local_file.example y crear local_file.example_renamed, que no es lo que queremos.

local_file.example: Refreshing state... [id=ec3adcab998872def2df6200fb03992ac6f237a4]

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  + create
  - destroy

Terraform will perform the following actions:

  ## local_file.example will be destroyed
  ## (because local_file.example is not in configuration)
  - resource "local_file" "example" {
      - content              = "This is an example file managed by Terraform." -> null
      - content_base64sha256 = "F5EYZhFNzSXdE4CUftwQoDVqvdiufZpVyiLMqyZVOcQ=" -> null
      - content_base64sha512 = "m1hvaxMuc/EhaKintyI54NSTTJ5yXpqHPCBNoHubF0rvF3JAj36lMj20aPcv21+3/OK+SqkiTlnT/LdvLCwqDA==" -> null
      - content_md5          = "a43bdd236c2f0f4d87452ba2ef0867e4" -> null
      - content_sha1         = "ec3adcab998872def2df6200fb03992ac6f237a4" -> null
      - content_sha256       = "17911866114dcd25dd1380947edc10a0356abdd8ae7d9a55ca22ccab265539c4" -> null
      - content_sha512       = "9b586f6b132e73f12168a8a7b72239e0d4934c9e725e9a873c204da07b9b174aef1772408f7ea5323db468f72fdb5fb7fce2be4aa9224e59d3fcb76f2c2c2a0c" -> null
      - directory_permission = "0777" -> null
      - file_permission      = "0777" -> null
      - filename             = "./example.txt" -> null
      - id                   = "ec3adcab998872def2df6200fb03992ac6f237a4" -> null
    }

  ## local_file.example_renamed will be created
  + resource "local_file" "example_renamed" {
      + content              = "This is an example file managed by Terraform."
      + content_base64sha256 = (known after apply)
      + content_base64sha512 = (known after apply)
      + content_md5          = (known after apply)
      + content_sha1         = (known after apply)
      + content_sha256       = (known after apply)
      + content_sha512       = (known after apply)
      + directory_permission = "0777"
      + file_permission      = "0777"
      + filename             = "./example.txt"
      + id                   = (known after apply)
    }

Plan: 1 to add, 0 to change, 1 to destroy.

Note: You didn't use the -out option to save this plan, so Terraform can't guarantee to take exactly these actions if you run "terraform apply" now.

Para solucionar esto, le diremos a Terraform que simplemente hemos movido el recurso. Ejecute el comando terraform state mv con la dirección antigua y la dirección nueva:

terraform state mv local_file.example local_file.example_renamed

Verá un mensaje de confirmación:

Move "local_file.example" to "local_file.example_renamed"
Successfully moved 1 object(s).

Ahora, ejecute terraform plan de nuevo:

terraform plan

Esta vez, Terraform informa que no se necesitan cambios porque el estado ahora coincide con la configuración.

local_file.example_renamed: Refreshing state... [id=ec3adcab998872def2df6200fb03992ac6f237a4]

No changes. Your infrastructure matches the configuration.

Terraform has compared your real infrastructure against your configuration and found no differences, so no changes are needed.

Ejecutar terraform refresh para actualizar el estado

En este paso, utilizará terraform refresh para reconciliar el archivo de estado con la infraestructura del mundo real. A veces, se realizan cambios en su infraestructura fuera del control de Terraform. Esto se conoce como "drift" (desviación). El comando refresh actualiza el archivo de estado para reflejar estos cambios.

Simulemos la desviación eliminando manualmente el archivo que creó Terraform.

rm example.txt

Ahora, si ejecuta un plan, Terraform detectará que el archivo falta y necesita ser recreado.

terraform plan
local_file.example_renamed: Refreshing state... [id=ec3adcab998872def2df6200fb03992ac6f237a4]

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  ## local_file.example_renamed will be created
  + resource "local_file" "example_renamed" {
      + content              = "This is an example file managed by Terraform."
      + content_base64sha256 = (known after apply)
      + content_base64sha512 = (known after apply)
      + content_md5          = (known after apply)
      + content_sha1         = (known after apply)
      + content_sha256       = (known after apply)
      + content_sha512       = (known after apply)
      + directory_permission = "0777"
      + file_permission      = "0777"
      + filename             = "./example.txt"
      + id                   = (known after apply)
    }

Plan: 1 to add, 0 to change, 0 to destroy.

Note: You didn't use the -out option to save this plan, so Terraform can't guarantee to take exactly these actions if you run "terraform apply" now.

Sin embargo, el comando terraform refresh también se puede utilizar para actualizar explícitamente el estado. Este comando comprueba los recursos reales y actualiza el archivo de estado en consecuencia.

terraform refresh
local_file.example_renamed: Refreshing state... [id=ec3adcab998872def2df6200fb03992ac6f237a4]

Ahora ejecute terraform plan de nuevo para confirmar que el estado está actualizado.

terraform plan
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  ## local_file.example_renamed will be created
  + resource "local_file" "example_renamed" {
      + content              = "This is an example file managed by Terraform."
      + content_base64sha256 = (known after apply)
      + content_base64sha512 = (known after apply)
      + content_md5          = (known after apply)
      + content_sha1         = (known after apply)
      + content_sha256       = (known after apply)
      + content_sha512       = (known after apply)
      + directory_permission = "0777"
      + file_permission      = "0777"
      + filename             = "./example.txt"
      + id                   = (known after apply)
    }

Plan: 1 to add, 0 to change, 0 to destroy.

Note: You didn't use the -out option to save this plan, so Terraform can't guarantee to take exactly these actions if you run "terraform apply" now.

Ha utilizado con éxito terraform refresh para corregir la desviación del estado.

Resumen

¡Felicidades por completar este laboratorio sobre Gestión del Estado de Terraform (Terraform State Management)!

En este laboratorio, adquirió experiencia práctica con subcomandos esenciales de terraform state. Aprendió a:

  • Usar terraform show para ver una representación legible por humanos del estado de su infraestructura.
  • Inspeccionar el archivo JSON sin procesar terraform.tfstate para comprender su estructura.
  • Obtener una lista limpia de todos los recursos gestionados con terraform state list.
  • Renombrar de forma segura un recurso en su configuración y actualizar el estado consecuentemente usando terraform state mv.
  • Reconciliar su archivo de estado con la infraestructura del mundo real y corregir la desviación (drift) usando terraform refresh.

Dominar estos comandos es fundamental para gestionar su infraestructura de manera efectiva y con confianza utilizando Terraform.