En este artículo haremos un ejercicio introductorio que nos ayudará a entender la base de cómo estructurar pipelines y repositorios en Bitbucket Cloud para desplegar infraestructura como código utilizando Terraform.
La infraestructura la manejaremos utilizando Digital Ocean, por lo que si no tienes una cuenta, puedes crearla aquí.
1. Crear llaves con Putty Key Gen
Para este ejercicio, es necesario crear llaves de SSH. Una fórma rápida de hacerlo es a través de PuttyGen, el cual puedes descargar aquí
1) Abre PuttyGen y da clic en “Generate”:
2) Mueve el cursor del mouse de forma aleatoria en el área indicada. Esto es para que PuttyGen genere una llave SSH con datos aleatorios:
3) Una vez que la llave se genere, copiala el contenido y guardalo. La necesitaremos para el siguiente paso:
2. Crear llave SSH en DigitalOcean
1) En el menú izquierdo, entra a “Settings”:
2) Entra a la pestaña “Security” y da clic en “Add SSH Key”
3) Pega la llave SSH que generaste con PuttyKey Gen (1) y nombrala “terraform” (1). Luego, da clic en “Add SSH Key”
4) En el menú izquierdo, entra a “API”:
5) En la pestaña de “Tokens”, da clic en “Generate new token”:
6) En el token name, pon “terraform” y habilita la opción de “Write”. Luego da clic en “Generate Token”.
7) Copia y guarda el token generado (si lo pierdes, tendrás que generarlo de nuevo):
3. Habilitar Pipeline de BitBucket
Es recomendable que el código que se encargará de desplegar y configurar nuestra infraestructura esté en un repositorio dedicado a ello, en lugar de tenerlo en el mismo repositorio que nuestro proyecto.
Esto nos brinda diversas ventajas. Entre las principales:
1) Podemos reutilizar la infraestructura para múltiples microservicios
2) Reducimos riesgos de que se realicen cambios en archivos de infraestructura
3) Reducimos complejidad en el repositorio y en el proyecto en general, ya que no será necesario que nuevos miembros del equipo entiendan la infraestructura
1) Crea el repositorio en BitBucket (Asegúrate de incluír el readme, para que el repositorio ya esté inicializado)
2) En el menú de la izquierda, entra a “pipelines” y luego selecciona la opción “view more”:
3) Selecciona la plantilla de Terraform:
Esto agregará el archivo bitbucket-pipelines.yml a tu repositorio.
4. Crear archivos de configuración de infraestructura en BitBucket
En esta sección, agregaremos los archivos de Terraform que se encargarán de crear la infraestructura en Digital Ocean.
1) En el menú izquierdo, entra a “Source” (1), luego da clic en los tres puntos (2) y da clic en “Add file” (3):
2) Nombra al archivo “data-sources.tf”, ponle el contenido siguiente y da clic en “commit”
data "external" "droplet_name" { program = ["echo", "{\"name\": \"terraformdroplet\"}"] }
3) Crea ahora un archivo llamado “droplets.tf” y pon el siguiente contenido. En la línea 2, debes de poner el nombre que asignaste a la llave SSH en digital ocean (“terraform”).
data "digitalocean_ssh_key" "ssh_key" { name = "terraform" } resource "digitalocean_droplet" "web" { image = "ubuntu-20-04-x64" name = data.external.droplet_name.result.name region = "fra1" size = "s-1vcpu-1gb" ssh_keys = [ data.digitalocean_ssh_key.ssh_key.id ] }
4) Crea un archivo llamado “provider.tf” con el siguiente contenido:
provider "digitalocean" { token = var.do_token }
5) Crea un archivo llamado “variables.tf” con el siguiente contenido:
variable "do_token" {} variable "domain_name" {}
5) Crea un archivo llamado “versions.tf” con el siguiente contenido:
terraform { required_providers { digitalocean = { source = "digitalocean/digitalocean" version = "~> 2.0" } } }
5. Configurar el pipeline de BitBucket
1) Abre el archivo “bitbucket-pipelines.tml” y da clic en “Edit”:
2) En el panel de la izquierda, expande “Add variables” y agrega las siguientes variables:
a) DO_PAT, cuyo valor debe ser el token de digital ocean que creaste en la sección de “API”
b) DO_DOMAIN_NAME, al cual puedes asignarle el valor que desees (en este tutorial no estámos asignando un dominio a la infraestructura, por lo cual es irrelevante)
3) Reemplaza todo el código con el siguiente. A continuación explicamos las líneas más relevantes:
Línea 11: Inicializamos el plan de terraform, pasandole la variable “DO_PAT”
Línea 12: Ejecutamos el aprovisionamiento de infraestructura. El atributo “-auto-approve” es para que el pipeline no se quede esperando por una confirmación para iniciar la infraestructura
Línea 13: Comando para obtener la IP del servidor que se aprovisionó en Digital Ocean
Línea 14: Comando para destruir el servidor (opcional)
image: hashicorp/terraform pipelines: default: - parallel: - step: name: Test script: - terraform init - terraform validate - terraform plan -var "do_token=$DO_PAT" -var "domain_name=$DO_DOMAIN_NAME" - terraform apply -auto-approve -var "do_token=$DO_PAT" -var "domain_name=$DO_DOMAIN_NAME" - terraform show | grep "ipv4" - terraform destroy -auto-approve -var "do_token=$DO_PAT" -var "domain_name=$DO_DOMAIN_NAME"
4) Da clic en “Commit”
5) En el menú izquierdo, entra a “Pipelines”
6) Podrás ver que el pipeline está en ejecución. Entra a dicho pipeline
7) Podremos ver el momento en que el pipeline comienza a crear el servidor en Digital Ocean:
8) A la par, en la consola de DigitalOcean, podremos comprobar que el servidor está siendo creado:
9) Al ser creado, en DigitalOcean podremos ver la IP que le fue asignada y, a su vez, en el pipeline podemos comprobar que obtiene correctamente la IP con el comando “terraform show”.
10) Finalmente, el pipeline destruirá el droplet y este desaparecerá de Digital Ocean.
Comentarios finales
Espero este tutorial te sirva como una introducción a la adminstración de infraestructura como código.
En este ejercicio hicimos una prueba muy sencilla, omitiendo muchas configuraciones que normalmente se tienen que hacer en la infraestructura, tales como variables de entorno, memoria, permisos, carpetas, entre otros. Sin embargo, este ejercicio puede ser el punto de partida para que vayas incorporando todo ello en los archivos de configuración de Terraform.