Cómo gestionar datos de infraestructura con salidas de Terraform

Introducción

Las salidas de Terraform se utilizan para extraer información sobre los recursos de infraestructura del estado del proyecto. Utilizando otras características del Lenguaje de Configuración de Hashicorp (HCL), que utiliza Terraform, se puede consultar e transformar información de recursos en estructuras de datos más complejas, como listas y mapas. Las salidas son útiles para proporcionar información a software externo, que puede operar sobre los recursos de infraestructura creados.

En este tutorial, aprenderá sobre la sintaxis de las salidas de Terraform y sus parámetros creando una infraestructura simple que implementa Dropletes. También parseará las salidas de forma programática convirtiéndolas en JSON.

Prerrequisitos

Nota: Este tutorial ha sido específicamente probado con Terraform 1.0.2.

Definiendo Salidas

En esta sección, declararás un Droplet, lo desplegarás en la nube, y aprenderás sobre las salidas definiendo una que mostrará la dirección IP del Droplet.

Desde la carpeta terraform-outputs que creaste como precondición, cree y abra el archivo droplets.tf para edición:

  1. nano droplets.tf

Agregue el recurso de Droplet y la definición de salida siguientes:

terraform-outputs/droplets.tf
resource "digitalocean_droplet" "web" {
  image  = "ubuntu-20-04-x64"
  name   = "test-droplet"
  region = "fra1"
  size   = "s-1vcpu-1gb"
}

output "droplet_ip_address" {
  value = digitalocean_droplet.web.ipv4_address
}

Lo primero es declarar una instancia de Droplet llamada web. Su nombre real en la nube será test-droplet, en la región fra1, con Ubuntu 20.04.

Luego, declara un salida llamada droplet_ip_address. En Terraform, las salidas se usan para exportar y mostrar valores y información sobre los recursos internos y calculados. Aquí, establece el parámetro value, que acepta el dato a exportar, como la dirección IP de la instancia Droplet declarada. En Terraform, el valor es desconocido hasta que la instancia de Droplet sea deployada. Las salidas se muestran después de cada deploy.

Guarde y cierre el archivo, luego deploye el proyecto ejecutando el siguiente comando:

  1. terraform apply -var "do_token=${DO_PAT}"

Entrar si cuando se le pregunte. El final del resultado será similar a este:

Output
... digitalocean_droplet.web: Creating... ... digitalocean_droplet.web: Creation complete after 32s [id=207631771] Apply complete! Resources: 1 added, 0 changed, 0 destroyed. Outputs: droplet_ip_address = ip_address

La dirección IP resaltada pertenece al nuevo Droplet deployeado. Al finalizar el deploy, Terraform muestra la información de las salidas al final, cuando todos los atributos de los recursos estén disponibles. Sin la salida droplet_ip_address, Terraform solo mostraría que la instancia de Droplet fue deployeada.

Pueden también ser mostradas usando el comando output:

  1. terraform output

El output listará todas las salidas en el proyecto:

Output
droplet_ip_address = ip_address

Puedes consultar una salida específica por nombre especificándola como argumento:

  1. terraform output output_name

Para droplet_ip_address, la salida consistirá únicamente en la dirección IP:

Output
ip_address

Además de especificar el parámetro obligatorio value, las salidas tienen algunos parámetros opcionales:

  • descripción: incorpora una breve documentación detallada sobre lo que muestra la salida.
  • depende_de: un parámetro meta disponible en cada recurso que permite especificar explícitamente los recursos en los que el resultado depende y que Terraform no puede deducir automáticamente durante la planificación.
  • sensible: acepta un valor booleano, que previene que el contenido de la salida sea mostrado después de desplegarla si se establece como true.

El parámetro sensible es útil cuando las trazas de la implementación de Terraform serán públicamente disponibles, pero el contenido de la salida debería mantenerse oculto. Ahora agregaráslo a tu definición de recurso de Droplets.

Abre droplets.tf para editar y agrega la línea resaltada:

terraform-outputs/droplets.tf
resource "digitalocean_droplet" "web" {
  image  = "ubuntu-20-04-x64"
  name   = "test-droplet"
  region = "fra1"
  size   = "s-1vcpu-1gb"
}

output "droplet_ip_address" {
  value      = digitalocean_droplet.web.ipv4_address
  sensitive = true
}

Guarda y cierra el archivo cuando haya terminado. Deploy the project again by running:

  1. terraform apply -var "do_token=${DO_PAT}"

Enter yes when prompted. You’ll see that the output is redacted:

Output
... Apply complete! Resources: 0 added, 0 changed, 0 destroyed. Outputs: droplet_ip_address = <sensitive>

Even if it’s marked as sensible, the output and its contents will still be available through other channels, such as viewing the Terraform state or querying the outputs directly.

En el paso siguiente, crearás un Droplet diferente y una estructura de salida diferente, por lo que destruye los Droplet actualmente implementados mediante la ejecución:

  1. terraform destroy -var "do_token=${DO_PAT}"

La salida al final será:

Output
... Destroy complete! Resources: 1 destroyed.

Ha declarado y desplegado un Droplet y creado una salida que muestra su dirección IP. Ahora aprenderás sobre el uso de salidas para mostrar estructuras más complejas, como listas y mapas.

Espacio de trabajo complejo

En esta sección, utilizarás el parámetro count para ejecutar múltiples instancias de la misma definición de recurso con una definición modificada que incluye el índice actual y así poder distinguir entre ellas posteriormente.

Uso del bucle for

Primero deberás abrir la definición de recurso de la mochila para editarla:

  1. nano droplets.tf

La definición debe parecer así:

terraform-outputs/droplets.tf
resource "digitalocean_droplet" "web" {
  count  = 3
  image  = "ubuntu-20-04-x64"
  name   = "test-droplet-${count.index}"
  region = "fra1"
  size   = "s-1vcpu-1gb"
}

Estás especificando que se cree tres instancias usando el parámetro count y has agregado el índice actual al nombre de la instancia de la nube, de manera que puedas diferenciar entre ellas más tarde. Elimine la salida existente debajo. Cuando lo haya hecho, guarde y cierre el archivo.

Aplique el código mediante la ejecución:

  1. terraform apply -var "do_token=${DO_PAT}"

Terraform planeará la creación de tres nubes llamadas test-droplet-0, test-droplet-1, y test-droplet-2. Entrará en cuando le pregunten para finalizar el proceso. Verás la siguiente salida al final:

Output
... Apply complete! Resources: 3 added, 0 changed, 0 destroyed.

Esto significa que las tres nubes han sido desplegadas exitosamente y que toda la información sobre ellas está almacenada en la estructura de estado del proyecto.

La manera más fácil de acceder a los atributos de recursos es mediante salidas, pero crear una para cada Dropletto no es escalable. La solución es usar el bucle for para iterar sobre la lista de Droplettos y obtener sus atributos, o alternativamente usar expresiones splat (que aprenderás más tarde en este paso).

Primero definirás una salida que emitirá las direcciones IP de los tres Droplet, parejadas con sus nombres. Abre droplets.tf para editar:

  1. nano droplets.tf

Agrega las siguientes líneas:

terraform-outputs/droplets.tf
resource "digitalocean_droplet" "web" {
  count  = 3
  image  = "ubuntu-20-04-x64"
  name   = "test-droplet-${count.index}"
  region = "fra1"
  size   = "s-1vcpu-1gb"
}

output "droplet_ip_addresses" {
  value = {
    for droplet in digitalocean_droplet.web:
    droplet.name => droplet.ipv4_address
  }
}

La valorización de salida de droplet_ip_addresses se construye utilizando un bucle for. Porque está encerrado entre paréntesis, el tipo resultante será un mapa. El bucle recorre la lista de Dropletos y para cada instancia, combina su nombre con su dirección IP y lo anade al mapa resultante.

Guarda y cierra el archivo, luego aplica el proyecto de nuevo:

  1. terraform apply -var "do_token=${DO_PAT}"

Escribe si cuando se le pregunte y recibirás los detalles de la salida al final:

Output
Apply complete! Resources: 0 added, 0 changed, 0 destroyed. Outputs: droplet_ip_addresses = { "test-droplet-0" = "ip_address" "test-droplet-1" = "ip_address" "test-droplet-2" = "ip_address" }

El contenido de la salida droplet_ip_addresses muestra las direcciones IP de los tres droplet deployados.

Usando la comanda output de Terraform, puedes obtener el contenido de la salida como JSON usando su argumento de comando:

  1. terraform output -json droplet_ip_addresses

El resultado será similar a lo siguiente:

Output
{"test-droplet-0":"ip_address","test-droplet-1":"ip_address","test-droplet-2":"ip_address"}

La interpretación de JSON es ampliamente utilizada y soportada en muchos lenguajes de programación. De esta manera, puedes analizar información programáticamente sobre los recursos deployados de Droplet.

Utilizando expresiones de dispersión

Las expresiones de dispersión proporcionan una manera compacta de iterar sobre todos los elementos de una lista y recopilar el contenido de un atributo de cada uno de ellos, resultando en una lista. Una expresión de dispersión que extraería las direcciones IP de los tres derrames desplegados tendría la siguiente sintaxis:

digitalocean_droplet.web[*].ipv4_address

El simbolo [*] trae a cabo la iteración sobre la lista a su izquierda y para cada elemento, toma el contenido del atributo especificado en la derecha. Si la referencia a la izquierda no es una lista por sí misma, se convertirá en una donde será el único elemento.

Puedes abrir droplets.tf para editar y modificar las líneas siguientes para implementar esta funcionalidad:

terraform-outputs/droplets.tf
resource "digitalocean_droplet" "web" {
  count  = 3
  image  = "ubuntu-20-04-x64"
  name   = "test-droplet-${count.index}"
  region = "fra1"
  size   = "s-1vcpu-1gb"
}

output "droplet_ip_addresses" {
  value = digitalocean_droplet.web[*].ipv4_address
}

Después de guardar el archivo, aplica el proyecto ejecutando el siguiente comando:

  1. terraform apply -var "do_token=${DO_PAT}"

Recibirás una salida que ahora es una lista, y que contiene solo las direcciones IP de los Drops:

Output
... Apply complete! Resources: 0 added, 0 changed, 0 destroyed. Outputs: droplet_ip_addresses = [ "ip_address", "ip_address", "ip_address", ]

Para obtener la salida como JSON, ejecuta el siguiente comando:

  1. terraform output -json droplet_ip_addresses

La salida será una sola array:

Output
["ip_address","ip_address","ip_address"]

Has usado conjuntos de salidas junto con expresiones de dispersión y bucles for para exportar las direcciones IP de los Dropletas desplegadas. También has recibido el contenido de la salida como JSON, y ahora utilizarás jq —una herramienta para filtrar dinámicamente JSON según expresiones proporcionadas—para analizarlos.

Ejecución de la salida utilizando jq

En este paso, instalarás y aprenderás los fundamentos de jq, una herramienta para manipular documentos JSON. Usarálo para analizar las salidas de su proyecto de Terraform.

Si estás en Ubuntu, ejecuta el siguiente comando para instalar jq:

  1. sudo snap install jq

En macOS, puede usar Homebrew para instalarlo:

  1. brew install jq

jq aplica la expresión de procesamiento proporcionada sobre la entrada que se puede enviar por tubería. La tarea más fácil en jq es imprimir la entrada con formato atractivo:

  1. terraform output -json droplet_ip_addresses | jq '.'

Una vez más, siempre se puede pedir que se ejecute sin modificaciones con la operadora identidad (.):

Output
[ "first_ip_address", "second_ip_address", "third_ip_address" ]

Puedes obtener solo la segunda dirección IP usando notación de corchetes para contar desde cero:

  1. terraform output -json droplet_ip_addresses | jq '.[1]'

El resultado será:

Output
"second_ip_address"

Puedes pedir que el resultado de la expresión de procesamiento sea un arreglo, envolviéndola entre paréntesis:

  1. terraform output -json droplet_ip_addresses | jq '[.[1]]'

Obtendrás un arreglo de JSON muy formateado:

Output
[ "second_ip_address" ]

Puedes extraer partes de arrays en lugar de elementos individuales especificando un rango de índices dentro de corchetes:

  1. terraform output -json droplet_ip_addresses | jq '.[0:2]'

La salida será:

Output
[ "first_ip_address", "second_ip_address" ]

La rango 0:2 devuelve los dos elementos más próximos al comienzo de la lista; el límite superior no es incluyente, por lo que se obtienen solo los elementos en las posiciones 0 y 1.

Ahora puedes destruir recursos implementados ejecutando:

  1. terraform destroy -var "do_token=${DO_PAT}"

En este paso, has instalado jq y lo ha utilizado para procesar y manipular la salida de tu proyecto de Terraform, el cual despliega tres Dropletas.

Conclusión

Has aprendido sobre salidas de Terraform, usándolas para mostrar detalles sobre los recursos implementados y para exportar estructuras de datos construidas para posterior procesamiento externo. También has usado salidas para mostrar atributos de un único recurso, así como para mostrar mapas y listas conteniendo atributos de recursos.

Para más información detallada sobre las características de jq, visite las documentaciones oficiales.

Este tutorial es parte de la serie Cómo administrar infraestructura con Terraform . La serie cubre varios temas relacionados con Terraform, desde la instalación de Terraform por primera vez hasta la gestión de proyectos complejos.

Source:
https://www.digitalocean.com/community/tutorials/how-to-manage-infrastructure-data-with-terraform-outputs