Cómo desplegar Infraestructura como código con BitBucket y Terraform

[vc_row][vc_column][vc_row_inner][vc_column_inner][vc_column_text]

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í.

[/vc_column_text][/vc_column_inner][/vc_row_inner][vc_row_inner][vc_column_inner][vc_empty_space][/vc_column_inner][/vc_row_inner][vc_row_inner][vc_column_inner][vc_custom_heading text=”1. Crear llaves con Putty Key Gen” font_container=”tag:h5|font_size:25px|text_align:left|color:%23022e70″ use_theme_fonts=”yes”][/vc_column_inner][/vc_row_inner][vc_row_inner][vc_column_inner width=”1/2″][vc_column_text]

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”:

[/vc_column_text][/vc_column_inner][vc_column_inner width=”1/2″][vc_single_image image=”8623″ img_size=”full” alignment=”center”][/vc_column_inner][/vc_row_inner][vc_row_inner][vc_column_inner][vc_empty_space height=”20px”][/vc_column_inner][/vc_row_inner][vc_row_inner][vc_column_inner width=”1/2″][vc_column_text]

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:

[/vc_column_text][/vc_column_inner][vc_column_inner width=”1/2″][vc_single_image image=”8624″ img_size=”full” alignment=”center”][/vc_column_inner][/vc_row_inner][vc_row_inner][vc_column_inner][vc_empty_space height=”20px”][/vc_column_inner][/vc_row_inner][vc_row_inner][vc_column_inner width=”1/2″][vc_column_text]

3) Una vez que la llave se genere, copiala el contenido y guardalo. La necesitaremos para el siguiente paso:

[/vc_column_text][/vc_column_inner][vc_column_inner width=”1/2″][vc_single_image image=”8626″ img_size=”full” alignment=”center”][/vc_column_inner][/vc_row_inner][/vc_column][/vc_row][vc_row][vc_column][vc_row_inner][vc_column_inner][vc_custom_heading text=”2. Crear llave SSH en DigitalOcean” font_container=”tag:h5|font_size:25px|text_align:left|color:%23022e70″ use_theme_fonts=”yes”][/vc_column_inner][/vc_row_inner][vc_row_inner][vc_column_inner][vc_empty_space][/vc_column_inner][/vc_row_inner][vc_row_inner][vc_column_inner width=”1/2″][vc_column_text]

1) En el menú izquierdo, entra a “Settings”:

[/vc_column_text][/vc_column_inner][vc_column_inner width=”1/2″][vc_single_image image=”8627″ img_size=”full” alignment=”center”][/vc_column_inner][/vc_row_inner][vc_row_inner][vc_column_inner][vc_empty_space height=”20px”][/vc_column_inner][/vc_row_inner][vc_row_inner][vc_column_inner][vc_column_text]

2) Entra a la pestaña “Security” y da clic en “Add SSH Key”

[/vc_column_text][vc_single_image image=”8628″ img_size=”full” alignment=”center”][/vc_column_inner][/vc_row_inner][vc_row_inner][vc_column_inner][vc_empty_space height=”20px”][/vc_column_inner][/vc_row_inner][vc_row_inner][vc_column_inner width=”1/2″][vc_column_text]

3) Pega la llave SSH que generaste con PuttyKey Gen (1) y nombrala “terraform” (1). Luego, da clic en “Add SSH Key”

[/vc_column_text][/vc_column_inner][vc_column_inner width=”1/2″][vc_single_image image=”8629″ img_size=”full” alignment=”center”][/vc_column_inner][/vc_row_inner][vc_row_inner][vc_column_inner][vc_empty_space height=”20px”][/vc_column_inner][/vc_row_inner][vc_row_inner][vc_column_inner width=”1/2″][vc_column_text]

4) En el menú izquierdo, entra a “API”:

[/vc_column_text][/vc_column_inner][vc_column_inner width=”1/2″][vc_single_image image=”8630″ img_size=”full” alignment=”center”][/vc_column_inner][/vc_row_inner][vc_row_inner][vc_column_inner][vc_empty_space height=”20px”][/vc_column_inner][/vc_row_inner][vc_row_inner][vc_column_inner][vc_column_text]

5) En la pestaña de “Tokens”, da clic en “Generate new token”:

[/vc_column_text][vc_single_image image=”8631″ img_size=”full” alignment=”center”][/vc_column_inner][/vc_row_inner][vc_row_inner][vc_column_inner][vc_empty_space height=”20px”][/vc_column_inner][/vc_row_inner][vc_row_inner][vc_column_inner width=”1/2″][vc_column_text]

6) En el token name, pon “terraform” y habilita la opción de “Write”. Luego da clic en “Generate Token”.

[/vc_column_text][/vc_column_inner][vc_column_inner width=”1/2″][vc_single_image image=”8632″ img_size=”full” alignment=”center”][/vc_column_inner][/vc_row_inner][vc_row_inner][vc_column_inner][vc_empty_space height=”20px”][/vc_column_inner][/vc_row_inner][vc_row_inner][vc_column_inner][vc_column_text]

7) Copia y guarda el token generado (si lo pierdes, tendrás que generarlo de nuevo):

[/vc_column_text][vc_single_image image=”8633″ img_size=”full” alignment=”center”][/vc_column_inner][/vc_row_inner][/vc_column][/vc_row][vc_row][vc_column][vc_row_inner][vc_column_inner][vc_custom_heading text=”3. Habilitar Pipeline de BitBucket” font_container=”tag:h5|font_size:25px|text_align:left|color:%23022e70″ use_theme_fonts=”yes”][vc_column_text]

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

[/vc_column_text][/vc_column_inner][/vc_row_inner][vc_row_inner][vc_column_inner][vc_empty_space][/vc_column_inner][/vc_row_inner][vc_row_inner][vc_column_inner width=”1/2″][vc_column_text]

1) Crea el repositorio en BitBucket (Asegúrate de incluír el readme, para que el repositorio ya esté inicializado)

[/vc_column_text][/vc_column_inner][vc_column_inner width=”1/2″][vc_single_image image=”8634″ img_size=”full” alignment=”center”][/vc_column_inner][/vc_row_inner][vc_row_inner][vc_column_inner][vc_empty_space height=”20px”][/vc_column_inner][/vc_row_inner][vc_row_inner][vc_column_inner width=”1/2″][vc_column_text]

2) En el menú de la izquierda, entra a “pipelines” y luego selecciona la opción “view more”:

[/vc_column_text][/vc_column_inner][vc_column_inner width=”1/2″][vc_single_image image=”8635″ img_size=”full” alignment=”center”][/vc_column_inner][/vc_row_inner][vc_row_inner][vc_column_inner][vc_empty_space height=”20px”][/vc_column_inner][/vc_row_inner][vc_row_inner][vc_column_inner width=”1/2″][vc_column_text]

3) Selecciona la plantilla de Terraform:

[/vc_column_text][/vc_column_inner][vc_column_inner width=”1/2″][vc_single_image image=”8636″ img_size=”full” alignment=”center”][/vc_column_inner][/vc_row_inner][vc_row_inner][vc_column_inner][vc_empty_space height=”20px”][/vc_column_inner][/vc_row_inner][vc_row_inner][vc_column_inner][vc_column_text]

Esto agregará el archivo bitbucket-pipelines.yml a tu repositorio.

[/vc_column_text][/vc_column_inner][/vc_row_inner][/vc_column][/vc_row][vc_row][vc_column][vc_row_inner][vc_column_inner][vc_custom_heading text=”4. Crear archivos de configuración de infraestructura en BitBucket” font_container=”tag:h5|font_size:25px|text_align:left|color:%23022e70″ use_theme_fonts=”yes”][vc_column_text]En esta sección, agregaremos los archivos de Terraform que se encargarán de crear la infraestructura en Digital Ocean.[/vc_column_text][/vc_column_inner][/vc_row_inner][vc_row_inner][vc_column_inner width=”1/2″][vc_column_text]

1) En el menú izquierdo, entra a “Source” (1), luego da clic en los tres puntos (2) y da clic en “Add file” (3):

[/vc_column_text][/vc_column_inner][vc_column_inner width=”1/2″][vc_single_image image=”8637″ img_size=”full” alignment=”center”][/vc_column_inner][/vc_row_inner][vc_row_inner][vc_column_inner][vc_empty_space height=”20px”][/vc_column_inner][/vc_row_inner][vc_row_inner][vc_column_inner][vc_column_text]

2) Nombra al archivo data-sources.tf, ponle el contenido siguiente y da clic en “commit”

data "external" "droplet_name" {
  program = ["echo", "{\"name\": \"terraformdroplet\"}"]
}

 

[/vc_column_text][vc_single_image image=”8639″ img_size=”full” alignment=”center”][/vc_column_inner][/vc_row_inner][vc_row_inner][vc_column_inner][vc_empty_space height=”20px”][/vc_column_inner][/vc_row_inner][vc_row_inner][vc_column_inner][vc_column_text]

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
  ]
}

 

[/vc_column_text][/vc_column_inner][/vc_row_inner][vc_row_inner][vc_column_inner][vc_empty_space height=”20px”][/vc_column_inner][/vc_row_inner][vc_row_inner][vc_column_inner][vc_column_text]

4) Crea un archivo llamado “provider.tf” con el siguiente contenido:

provider "digitalocean" {
  token = var.do_token
}

 

[/vc_column_text][/vc_column_inner][/vc_row_inner][vc_row_inner][vc_column_inner][vc_empty_space height=”20px”][/vc_column_inner][/vc_row_inner][vc_row_inner][vc_column_inner][vc_column_text]

5) Crea un archivo llamado “variables.tf” con el siguiente contenido:

variable "do_token" {}
variable "domain_name" {}

 

[/vc_column_text][/vc_column_inner][/vc_row_inner][vc_row_inner][vc_column_inner][vc_empty_space height=”20px”][/vc_column_inner][/vc_row_inner][vc_row_inner][vc_column_inner][vc_column_text]

5) Crea un archivo llamado “versions.tf” con el siguiente contenido:

terraform {
  required_providers {
    digitalocean = {
      source = "digitalocean/digitalocean"
      version = "~> 2.0"
    }
  }
}

 

[/vc_column_text][/vc_column_inner][/vc_row_inner][/vc_column][/vc_row][vc_row][vc_column][vc_row_inner][vc_column_inner][vc_custom_heading text=”5. Configurar el pipeline de BitBucket” font_container=”tag:h5|font_size:25px|text_align:left|color:%23022e70″ use_theme_fonts=”yes”][/vc_column_inner][/vc_row_inner][vc_row_inner][vc_column_inner][vc_column_text]

1) Abre el archivo “bitbucket-pipelines.tml” y da clic en “Edit”:

[/vc_column_text][vc_single_image image=”8640″ img_size=”full” alignment=”center”][/vc_column_inner][/vc_row_inner][vc_row_inner][vc_column_inner][vc_empty_space height=”20px”][/vc_column_inner][/vc_row_inner][vc_row_inner][vc_column_inner][vc_column_text]

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)

[/vc_column_text][vc_single_image image=”8641″ img_size=”full” alignment=”center”][/vc_column_inner][/vc_row_inner][vc_row_inner][vc_column_inner][vc_empty_space height=”20px”][/vc_column_inner][/vc_row_inner][vc_row_inner][vc_column_inner][vc_column_text]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"

 

[/vc_column_text][/vc_column_inner][/vc_row_inner][vc_row_inner][vc_column_inner][vc_empty_space height=”20px”][/vc_column_inner][/vc_row_inner][vc_row_inner][vc_column_inner width=”1/2″][vc_column_text]

4) Da clic en “Commit”

5) En el menú izquierdo, entra a “Pipelines”

[/vc_column_text][/vc_column_inner][vc_column_inner width=”1/2″][vc_single_image image=”8642″ img_size=”full” alignment=”center”][/vc_column_inner][/vc_row_inner][vc_row_inner][vc_column_inner][vc_empty_space height=”20px”][/vc_column_inner][/vc_row_inner][vc_row_inner][vc_column_inner][vc_column_text]

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:

[/vc_column_text][vc_single_image image=”8643″ img_size=”full” alignment=”center”][/vc_column_inner][/vc_row_inner][vc_row_inner][vc_column_inner][vc_empty_space height=”20px”][/vc_column_inner][/vc_row_inner][vc_row_inner][vc_column_inner][vc_column_text]

8) A la par, en la consola de DigitalOcean, podremos comprobar que el servidor está siendo creado:

[/vc_column_text][vc_single_image image=”8644″ img_size=”full” alignment=”center”][/vc_column_inner][/vc_row_inner][vc_row_inner][vc_column_inner][vc_empty_space height=”20px”][/vc_column_inner][/vc_row_inner][vc_row_inner][vc_column_inner][vc_column_text]

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”.

[/vc_column_text][vc_single_image image=”8645″ img_size=”full” alignment=”center”][/vc_column_inner][/vc_row_inner][vc_row_inner][vc_column_inner][vc_column_text]

10) Finalmente, el pipeline destruirá el droplet y este desaparecerá de Digital Ocean.

[/vc_column_text][/vc_column_inner][/vc_row_inner][vc_row_inner][vc_column_inner][vc_empty_space height=”20px”][/vc_column_inner][/vc_row_inner][/vc_column][/vc_row][vc_row][vc_column][vc_row_inner][vc_column_inner][vc_custom_heading text=”Comentarios finales” font_container=”tag:h5|font_size:25px|text_align:left|color:%23022e70″ use_theme_fonts=”yes”][vc_column_text]

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.

[/vc_column_text][/vc_column_inner][/vc_row_inner][/vc_column][/vc_row]

Scan the code