Cómo utilizar Terraform con tu equipo

El autor seleccionó el Fondo de Software Libre y de Código Abierto para recibir una donación como parte del programa Escribir para Donaciones.

Introducción

Cuando varias personas trabajan en el mismo proyecto de Terraform desde diferentes ubicaciones simultáneamente, es importante manejar correctamente el código de infraestructura y el estado del proyecto para evitar errores de sobrescritura. La solución es almacenar el estado de forma remota en lugar de localmente. Un sistema remoto está disponible para todos los miembros de tu equipo, y es posible que bloqueen el estado mientras trabajan.

Uno de estos backends remotos es pg, que almacena el estado en una base de datos PostgreSQL. Durante el transcurso de este tutorial, lo utilizarás con una Base de Datos Gestionada de DigitalOcean para garantizar la disponibilidad de datos.

Terraform también admite la oferta en la nube oficial y gestionada por Hashicorp llamada Terraform Cloud—una aplicación propietaria que sincroniza el trabajo de tu equipo en un solo lugar y ofrece una interfaz de usuario para configuración y gestión.

En este tutorial, crearás una organización en Terraform Cloud a la que conectarás tu proyecto. Luego usarás tu organización para configurar espacios de trabajo y recursos. Almacenarás tu estado en la nube gestionada para que esté siempre disponible. También configurarás el backend pg con una base de datos PostgreSQL gestionada asociada.

Prerrequisitos

Nota: Hemos probado específicamente este tutorial utilizando Terraform 1.1.3.

Almacenamiento de estado en una base de datos PostgreSQL administrada

En esta sección, configurará un proyecto que implementa un Droplet y almacena el estado en una base de datos PostgreSQL administrada de DigitalOcean utilizando el proveedor pg. Este proveedor admite el bloqueo de estado, por lo que el estado nunca se sobrescribirá por dos o más cambios que ocurran al mismo tiempo.

Comience creando un directorio llamado terraform-team-pg en el cual almacenará el proyecto:

  1. mkdir ~/terraform-team-pg

Navegue hacia él:

  1. cd ~/terraform-team-pg

Primero definirá el proveedor y luego pasará la cadena de conexión para la base de datos y el módulo digitalocean. Cree y abra provider.tf para editarlo:

  1. nano provider.tf

Agregue las siguientes líneas:

~/terraform-team-pg/provider.tf
terraform {
  required_providers {
    digitalocean = {
      source = "digitalocean/digitalocean"
      version = "~> 2.0"
    }
  }

  backend "pg" {
    conn_str = "your_db_connection_string"
  }
}

variable "do_token" {}

provider "digitalocean" {
  token = var.do_token
}

Aquí requiere el proveedor digitalocean y define el backend pg, que acepta una cadena de conexión. Luego, define la variable do_token y pásela a la instancia del proveedor digitalocean.

Recuerda reemplazar tu_cadena_de_conexión_db con la cadena de conexión para tu base de datos administrada desde tu Panel de Control de DigitalOcean, que puedes encontrar al presionar Acciones, seleccionar Detalles de conexión, y elegir Cadena de conexión en el menú desplegable. Luego guarda y cierra el archivo

Advertencia: Para continuar, en la Configuración de tu base de datos, asegúrate de tener la dirección IP de la máquina desde la cual estás ejecutando Terraform en una lista blanca.

Inicializa el proyecto ejecutando:

  1. terraform init

La salida será similar a lo siguiente:

Output
Initializing the backend... Successfully configured the backend "pg"! Terraform will automatically use this backend unless the backend configuration changes. Initializing provider plugins... - Finding digitalocean/digitalocean versions matching "~> 2.0"... - Installing digitalocean/digitalocean v2.16.0... - Installed digitalocean/digitalocean v2.16.0 (signed by a HashiCorp partner, key ID F82037E524B9C0E8) Partner and community providers are signed by their developers. If you'd like to know more about provider signing, you can read about it here: https://www.terraform.io/docs/cli/plugins/signing.html Terraform has created a lock file .terraform.lock.hcl to record the provider selections it made above. Include this file in your version control repository so that Terraform can guarantee to make the same selections by default when you run "terraform init" in the future. Terraform has been successfully initialized! ...

Terraform ha inicializado con éxito el backend, lo que significa que se conectó a la base de datos.

A continuación, define el Droplet en un archivo llamado droplets.tf. Créalo y ábrelo para editarlo ejecutando:

  1. nano droplets.tf

Agrega las siguientes líneas:

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

Este código desplegará un Droplet llamado web-1 en la región fra1, ejecutando Ubuntu 20.04 en 1 GB de RAM y un núcleo de CPU. Eso es todo lo que necesitas definir, así que guarda y cierra el archivo.

Necesitarás tu token de DigitalOcean en una variable de entorno. Crea uno, reemplazando tu_token_do con tu token:

  1. export DO_PAT="your_do_token"

Para comprobar que la conexión a la base de datos está funcionando, intenta planificar la configuración:

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

La salida será similar a lo siguiente:

Output
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: # Se creará digitalocean_droplet.web + resource "digitalocean_droplet" "web" { + backups = false + created_at = (known after apply) + disk = (known after apply) + graceful_shutdown = false + id = (known after apply) + image = "ubuntu-20-04-x64" + ipv4_address = (known after apply) + ipv4_address_private = (known after apply) + ipv6 = false + ipv6_address = (known after apply) + locked = (known after apply) + memory = (known after apply) + monitoring = false + name = "web-1" + price_hourly = (known after apply) + price_monthly = (known after apply) + private_networking = (known after apply) + region = "fra1" + resize_disk = true + size = "s-1vcpu-1gb" + status = (known after apply) + urn = (known after apply) + vcpus = (known after apply) + volume_ids = (known after apply) + vpc_uuid = (known after apply) } Plan: 1 to add, 0 to change, 0 to destroy. ...

Terraform no reportó errores y planificó las acciones como de costumbre. Se conectó correctamente a tu base de datos PostgreSQL y almacenó su estado. Ahora varias personas pueden trabajar en esto simultáneamente manteniendo el proyecto sincronizado.

Almacenando el Estado en Terraform Cloud

En este paso, crearás un proyecto que despliega un Droplet y utiliza Terraform Cloud como su backend con el proveedor cloud. Esto implica crear la organización y el espacio de trabajo en Terraform Cloud, escribir el código de infraestructura y planificarlo.

Creación de una Organización

Terraform Cloud te permite tener múltiples organizaciones, que albergan tus espacios de trabajo y módulos. Las organizaciones de plan de pago pueden tener varios equipos con funciones de control de nivel de acceso, mientras que el plan gratuito que utilizarás proporciona solo un equipo por organización. Puedes invitar a miembros del equipo a unirse a la organización.

Comienza por dirigirte a Terraform Cloud e iniciar sesión. Si aún no has creado una organización, te pedirá que lo hagas.

Ingresa un nombre de organización de tu elección y recuerda que debe ser único entre todos los nombres en Terraform Cloud. Recibirás un error si el nombre ya existe. La dirección de correo electrónico debería estar ya completada con la dirección de tu cuenta. Una vez que hayas terminado, haz clic en el botón Crear organización para continuar.

Luego te pedirá que selecciones el tipo de espacio de trabajo.

Dado que interactuarás con Terraform Cloud utilizando la línea de comandos, haz clic en la opción Flujo de trabajo basado en CLI. Luego, ingresa un nombre para tu espacio de trabajo y deja el campo de descripción vacío.

Ingresa un nombre de espacio de trabajo de tu elección (lo llamaremos sammy), luego haz clic en Crear espacio de trabajo para finalizar el proceso de creación de la organización. Luego te dirigirá a una página de configuración del espacio de trabajo.

Ahora has creado tu espacio de trabajo, que es parte de tu organización. Dado que acabas de crearlo, tu espacio de trabajo no contiene código de infraestructura. En la parte central de la interfaz, Terraform Cloud te proporciona instrucciones iniciales para conectarte a este espacio de trabajo.

Antes de conectarte a él, necesitarás configurar la versión de Terraform que la nube utilizará para ejecutar tus comandos. Para configurarlo, haz clic en el menú desplegable Configuración junto a Resumen y selecciona General de la lista. Cuando se abra la página, navega hasta el menú desplegable Versión de Terraform y selecciona 1.1.3 (para este tutorial).

Luego, haz clic en el botón Guardar configuración para guardar los cambios.

Para conectar tu proyecto a tu organización y espacio de trabajo, primero deberás iniciar sesión utilizando la línea de comandos. Antes de ejecutar el comando, dirígete a la página de tokens para crear un nuevo token de acceso para tu servidor, el cual proporcionará acceso a tu cuenta. Recibirás un aviso para crear un token de API.

La descripción predeterminada está bien, así que haz clic en Crear token de API para crearlo.

Haz clic en el valor del token, o en el icono que está después de él, para copiar el token de API. Utilizarás este token para conectar tu proyecto a tu cuenta de Terraform Cloud.

En la línea de comandos, ejecuta el siguiente comando para iniciar sesión:

  1. terraform login

Recibirás la siguiente salida:

Output
Terraform will request an API token for app.terraform.io using your browser. If login is successful, Terraform will store the token in plain text in the following file for use by subsequent commands: /home/sammy/.terraform.d/credentials.tfrc.json Do you want to proceed? Only 'yes' will be accepted to confirm. ...

Terraform te está advirtiendo que el token se almacenará localmente. Ingresa yes cuando te lo solicite:

Output
--------------------------------------------------------------------------------- Open the following URL to access the tokens page for app.terraform.io: https://app.terraform.io/app/settings/tokens?source=terraform-login --------------------------------------------------------------------------------- Generate a token using your browser, and copy-paste it into this prompt. Terraform will store the token in plain text in the following file for use by subsequent commands: /home/sammy/.terraform.d/credentials.tfrc.json Token for app.terraform.io: Enter a value:

Pega el token que has copiado y confirma con ENTER. Terraform mostrará un mensaje de éxito:

Output
... - ----- - --------- -- --------- - ----- --------- ------ ------- ------- --------- ---------- ---- ---------- ---------- -- ---------- ---------- Welcome to Terraform Cloud! - ---------- ------- --- ----- --- Documentation: terraform.io/docs/cloud -------- - ---------- ---------- --------- ----- - New to TFC? Follow these steps to instantly apply an example configuration: $ git clone https://github.com/hashicorp/tfc-getting-started.git $ cd tfc-getting-started $ scripts/setup.sh

Has configurado tu instalación local de Terraform para acceder a tu cuenta de Terraform Cloud. Ahora crearás un proyecto que despliega un Droplet y lo configurarás para que utilice Terraform Cloud para almacenar su estado.

Configuración del Proyecto

Primero, crea un directorio llamado terraform-team-cloud donde almacenarás el proyecto:

  1. mkdir ~/terraform-team-cloud

Navega hacia él:

  1. cd ~/terraform-team-cloud

Para configurar tu proyecto, necesitarás:

  • definir y configurar el proveedor cloud, que interactúa con Terraform Cloud.
  • requerir el proveedor digitalocean para poder implementar recursos de DigitalOcean.
  • definir e inicializar variables que utilizarás.

Almacenarás las especificaciones de los requisitos del proveedor y del módulo en un archivo llamado provider.tf. Crea y abre este archivo para editarlo ejecutando:

  1. nano provider.tf

Agrega las siguientes líneas:

~/terraform-team-cloud/provider.tf
terraform {
  required_providers {
    digitalocean = {
      source = "digitalocean/digitalocean"
      version = "~> 2.0"
    }
  }

  cloud {
    organization = "your_organization_name"

    workspaces {
      name = "your_workspace_name"
    }
  }
}

variable "do_token" {}

provider "digitalocean" {
  token = var.do_token
}

Aquí, primero especificas tu versión de Terraform. Luego, especificas el proveedor digitalocean como requerido y configuras el backend como cloud. Para organization y workspaces.name, reemplaza los valores resaltados con los nombres que especificaste.

A continuación, defines una variable llamada do_token, que pasas al proveedor digitalocean creado después de ella. Ahora has configurado tu proyecto para conectarte a tu organización, así que guarda y cierra el archivo.

Inicializa tu proyecto con el siguiente comando:

  1. terraform init

La salida será similar a esto:

Output
Initializing Terraform Cloud... Initializing provider plugins... - Finding digitalocean/digitalocean versions matching "~> 2.0"... - Installing digitalocean/digitalocean v2.18.0... - Installed digitalocean/digitalocean v2.18.0 (signed by a HashiCorp partner, key ID F82037E524B9C0E8) Partner and community providers are signed by their developers. If you'd like to know more about provider signing, you can read about it here: https://www.terraform.io/docs/cli/plugins/signing.html Terraform has created a lock file .terraform.lock.hcl to record the provider selections it made above. Include this file in your version control repository so that Terraform can guarantee to make the same selections by default when you run "terraform init" in the future. Terraform Cloud has been successfully initialized! ...

Dado que la definición de Droplet es la misma que en el proyecto anterior, puedes copiarla ejecutando:

  1. cp ../terraform-team-pg/droplets.tf .

Finalmente, definirás los valores de las variables. El proveedor de nube no admite pasar valores a variables a través de la línea de comandos, así que tendrás que pasarlos usando archivos de variables o establecerlos en Terraform Cloud. Terraform lee los valores de las variables de archivos con un nombre que termina en .auto.tfvars. Crea y abre un archivo llamado vars.auto.tfvars para editar, en el que definirás la variable do_token:

  1. nano vars.auto.tfvars

Agrega la siguiente línea, reemplazando tu_token_do con tu token de API de DigitalOcean:

vars.auto.tfvars
do_token = "your_do_token"

Cuando hayas terminado, guarda y cierra el archivo. Terraform leerá automáticamente este archivo al planificar acciones.

Tu proyecto ahora está completo y configurado para usar Terraform Cloud como su backend. Ahora planificarás y aplicarás el Droplet y revisarás cómo se refleja eso en la aplicación Cloud.

Aplicando la Configuración

En Paso 1 de este tutorial, planificaste un proyecto usando el comando terraform plan. Dado que el proyecto de Terraform Cloud tiene los mismos recursos definidos, puedes omitir planificarlo nuevamente y aplicarlo directamente a Terraform Cloud.

Aplica el proyecto ejecutando el siguiente comando para actualizarlo:

  1. terraform apply

Notarás que la salida es diferente cuando usas local como tu backend:

Output
Running apply in Terraform Cloud. Output will stream here. Pressing Ctrl-C will cancel the remote apply if it's still pending. If the apply started it will stop streaming the logs, but will not stop the apply running remotely. Preparing the remote apply... To view this run in a browser, visit: https://app.terraform.io/app/sammy-shark/sammy/runs/run-euVu9t1yUtuq5sy9 Waiting for the plan to start... Terraform v1.1.3 on linux_amd64 Configuring remote state backend... Initializing Terraform configuration... 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: # digitalocean_droplet.web será creado + resource "digitalocean_droplet" "web" { + backups = false + created_at = (known after apply) + disk = (known after apply) + graceful_shutdown = false + id = (known after apply) + image = "ubuntu-20-04-x64" + ipv4_address = (known after apply) + ipv4_address_private = (known after apply) + ipv6 = false + ipv6_address = (known after apply) + locked = (known after apply) + memory = (known after apply) + monitoring = false + name = "web-1" + price_hourly = (known after apply) + price_monthly = (known after apply) + private_networking = (known after apply) + region = "fra1" + resize_disk = true + size = "s-1vcpu-1gb" + status = (known after apply) + urn = (known after apply) + vcpus = (known after apply) + volume_ids = (known after apply) + vpc_uuid = (known after apply) } Plan: 1 to add, 0 to change, 0 to destroy. ...

Al usar el backend cloud, Terraform no está planeando ni aplicando la configuración desde la máquina local. En su lugar, delega esas tareas a Terraform Cloud y solo transmite la salida a la consola en tiempo real.

Ingresa yes cuando se te solicite. Terraform pronto terminará de aplicar la configuración, y puedes navegar al espacio de trabajo en el sitio web de Terraform Cloud para encontrar que se ha aplicado una nueva acción.

Ahora puedes destruir los recursos implementados ejecutando lo siguiente:

  1. terraform destroy

En esta sección, has conectado tu proyecto a Terraform Cloud, haciendo que el estado de tu proyecto sea accesible para tu equipo en un lugar central. Esto permite que el estado se comparta y se sincronice para todos los que tengan acceso al proyecto, lo que conduce a una experiencia más fluida.

Conclusión

En este tutorial, has utilizado dos backends diferentes: Terraform Cloud, que es la oferta en la nube gestionada de Hashicorp para Terraform; y pg, que te permite almacenar el estado del proyecto en una base de datos PostgreSQL. Has utilizado una base de datos PostgreSQL gestionada de DigitalOcean, que puedes aprovisionar y usar con Terraform en cuestión de minutos.

Para obtener más información sobre las características de Terraform Cloud, visita la documentación oficial.

Este tutorial es parte de la serie Cómo gestionar la infraestructura con Terraform. La serie cubre varios temas de 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-use-terraform-within-your-team