Terraform – Primeros pasos

¿Qué es terraform? ¿Por qué los DevOps lo aman? Imagina levantar servidores, bases de datos, redes, contenedores… todo con solo algunas líneas de código. ¿Suena interesante verdad?

Todo esto lo hace posible Terraform, Infraestructura como Código (IAC). Desarrollado por HashiCorp, permite definir nuestra infraestructura en archivos de configuración!

Ventajas de usar Terraform

  • Poner en línea servidores
  • Crear redes virtuales y balanceadores de carga
  • Automatizar y versionar entornos
  • Reproducir entornos completos (desarrollo/staging/producción)

¿Qué lenguaje usa Terraform?

Usa su propio lenguaje HCL (HashiCorp Configuration Language)

resource "leocorp_nginx" "nginx" {
  name  = "nginx_leocorp"
  image = "nginx:latest"
}

No es un lenguaje de programación tradicional, es más un lenguaje declarativo (tú describes el estado, terraform se encarga)

Manos a la obra

Levantaremos un servidor nginx usando Terraform, todo desde 0 y paso a paso.

Para esto ya debes tener instalado en tu equipo Docker y Terraform

Orden Orden Orden

Crearemos una carpeta dedicada para este proyecto

mkdir leocorp-terraform && cd leocorp-terraform

¿Qué archivos tendremos en esta carpeta?

Solemos utilizar los siguientes archivos:

  • main.tf: El principal archivo, es el que tendrá nuestra arquitectura
  • variables.tf: Hoja de configuración, al tener esto podemos trabajar con múltiples entornos
  • outputs.tf: Útil para describir lo que estamos creando

Arquitectura Principal

En esta oportunidad nos enfocaremos en main.tf debemos primero elegir nuestro proveedor, el plugin de proveedor nos permite añadir funcionalidades e interactuar con los componentes que necesitamos. En este caso utilizaremos kreuzwerker/docker en su versión más reciente 3.0.2.

terraform {
  required_providers {
    docker = {
      source  = "kreuzwerker/docker"
      version = "3.0.2"
    }
  }
}

Una vez instalado el plugin debemos configurar nuestro proveedor, como realizaremos esta prueba de manera local podemos colocar lo siguiente:


provider "docker" {}

Finalmente los recursos que queremos configurar, en este caso levantaremos un contenedor de nginx y configuramos el puerto 8080 en nuestro ordenador apuntando al puerto 80 en el contenedor.

resource "docker_container" "nginx" {
  name  = "nginx"
  image = "nginx:latest"
  ports {
    internal = 80
    external = 8080
  }
}

¿Ya estamos listos? Ya casi, debemos inicializar y aplicar la configuración

terraform init

Al inicializar se descargarán los plugins necesarios para poder desplegar nuestra arquitectura

Una vez inicializado podemos levantar nuestra arquitectura

terraform apply

Si todo va bien nos mostrará una lista de recursos que serán modificados/creados/eliminados

La aprobación es manual, descuida solo por ahora 😉

Una vez aprobado el plan de ejecución nuestro contenedor ya debería estar desplegado, podemos verificar con los logs

docker logs nginx

O accediendo al puerto 8080 desde nuestro navegador, donde veremos lo siguiente

Consideraciones

Ten en cuenta que estamos conectándonos a nuestro daemon de docker local, si no está ejecutándose el servicio puedes tener un error como este:

Si tienes problemas con los puertos prueba cambiando el puerto de tu host. En vez de 8080 podrías probar otros como 3000 o 4200.

Conclusiones

Hemos manipulado contenedores en nuestro daemon de docker de manera local y todo con archivos de configuración y la herramienta terraform!

Aún nos falta optimizar esto y realizar configuraciones que consideren diferentes valores según el entorno que deseamos desplegar, no te preocupes eso vendrá en la siguiente entrada 😀