Infraestructura: Uso de Terraform: Nginx en una VPS en Digital Ocean con Volumen asociado

Dentro del mundo de los servidores está habiendo una revolución en la automatización del despliegue de servidores. Proyectos como Ansible, Chef o Puppet se han convertido en herramientas fundamentales a la hora de gestionar servidores en masa de una manera eficiente. Pero con la llegada del mundo de la cloud se ha visto necesario automatizar la creación de los servidores y las herramientas que debemos instalar. En esta ocasión cómo crear una VPS con Nginx en Digital Ocean con un dispositivo de bloques o volumen asociado y una clave ssh para acceder.

Recuerda que esta guía es una continuación de la primera parte para instalar y configurar terraform con AWS y DigitalOcean.  Ahora iremos viendo los recursos que son necesarios para el despliegue de la VPS en Digital Ocean.

 

Variables

Definir las variables nos permitirá que nuestro código de despliegue sea mucho más reutilizable, ya que cambiando estas variables podremos desplegar distintas máquinas con distintas configuraciones.

Las variables mínimas de funcionamiento que necesitamos para gestionar esta VPS son las siguientes, por ejemplo en el main.tf:

variable "do_token" {}
variable "ssh_pub_path"{}
variable "region" {}
variable "project_name" {}

    • Project name: sería como el nombre del proyecto, esto nos va a permitir que los nombres de los distintos recursos que tenemos que crear se relacionen entre sí editando los nombres o etiquetas de cada componente a desplegar.
    • Region: es el nombre de la región donde queremos hacer el despliegue: en nuestro caso será fra1 el data center de Frankfurt. Es muy importante que revises usar l aregión correcta porque dependiendo de la región puedes disponer de recursos desplegados distintos.
    • SSH Pub Path: es la ruta al fichero de clave pública que usarás para conectar a la VPS
    • do token: es la vriable donde almacenaremos el API token de Digital Ocean

Provider

Como siempre elegiremos el proveedor que necesitamos, en este caso digitalocean:

provider "digitalocean" {
token = var.do_token
}

Como se puede ver, usamos la variable definida var.region_name para rellenar el provider.  Recuerda que puedes definir esta variable en el fichero terraform.tfvars


region_name="fra1"

Al igual que peudes definir todas las variables que necesites.

SSH

Los pares de claves permiten la gestión de claves ssh para el acceso a las máquinas vps. En DigitalOcean es otro recurso que podemos añadir con Terraform. veamos un ejemplo:


resource "digitalocean_ssh_key" "web-ssh" {
name = "${var.project_name}-key"
public_key = file("${var.ssh_pub_path}")
}

Como puede verse se define el recurso mediante una variable que debe contener ruta a la clave ssh pública y que se asocia con el parámetro ssh_pub_path. Además modificamos el nombre de la clave, teniendo en cuenta el nombre del proyecto definido como variable. Es una buena práctica que todos los recursos definidos en el despliegue tengan algún tipo de referencia al proyecto o aplicación que queremos desplegar. Para que los usuarios de DO puedan localizar fácilmente los recursos desde la consola de gestión.
Veamos un ejemplo de definición de la clave como variable:

ssh_pub_path="/home/user/.ssh/id_rsa.pub"

Si no sabes generar estas claves, mira esta guía para ubuntu.

Volumen de bloques

Aunque el sistema operativo no suele ocupar mucho espacio en disco, a no ser que uses windows claro, normalmente es una buena práctica, que los datos de las aplicaciones que necesitamos desplegar en las VPS’s, vayan alojados en una unidad de disco distinta del sistema, de esta manera si el disco del servidor se destruye, o si destruimos la máquina y la volvemos a crear, así no se perderían los datos que ya tuviésemos en ese dispositivo de bloques. Veamos ahora cómo definimos el recurso.


resource "digitalocean_volume" "web" {
region = var.region
name = "${var.project_name}-web-volume"
size = 10
initial_filesystem_type = "ext4"
description = "${var.project_name} web volume description"
}

En este caso estamos definiendo un volumen de 10GB de capacidad y como puede verse se ha de elegir el sistema de ficheros, ext4 en este ejemplo, y a descripción del recurso teniendo en cuenta el nombre del proyecto.

User Data

El user_data es un parámetro que podremos pasar  un droplet para ejecutar comandos desde un fichero de shell. para ello crearemos un fichero user_data.sh que usaremos de plantilla.


#!/usr/bin/env bash
set -x
exec > >(tee /var/log/user-data.log|logger -t user-data -s 2>/dev/console) 2>&1
export PATH="$PATH:/usr/bin"
sudo apt-get update
sudo apt-get -y install nginx
sudo rm -rf /var/www/html
sudo mkdir /mnt/demo_web_volume/html
sudo ln -s /mnt/demo_web_volume/html /var/www/html
sudo echo "

Hola Terraform

” >> /var/www/html/index.html
sudo chown -R www-data:www-data /var/www/html/index.html
sudo chmod -R 755 /var/www/html/index.html

El fichero como se puede ver tiene los comandos necesarios para istalar Nginx, crear un enlace a /var/www/html para que los datos estén en el volumen que hemos creado antes, crear un nuevo fichero index.html y colocarlo en la carpeta con los permisos adecuados.

Ahora necesitaremos crear una plantilla de terraform con el contenido de este fichero:

data "template_file" "userdata" {
template = "${file("${path.module}/userdata.sh")}"
}

En el droplet aplicaremos este fichero para que se ejecute según arranque la VPS.

Droplet

Ahora ya podemos definir la VPS en Digital Ocean.


esource "digitalocean_droplet" "web" {
name = "${var.project_name}-web"
image = "ubuntu-20-04-x64"
region = var.region
size = "s-1vcpu-1gb"
backups = true
user_data = "${data.template_file.userdata.rendered}"
ssh_keys = [digitalocean_ssh_key.web-ssh.fingerprint]
}

En este recurso estamos asociando casi todos los demás, además de definir el tipo de instancia, mediante el parámetro size. En el image definios la imagen a usar para la instalación de sistema, necesitamos también asociarle el fingerprint de la clave ssh, a región donde irá desplegada y que queremos usar los backups para el volumen principal de la vps.
Además enlazamos el fichero user_data para que se ejecute en según arranque la vps.

Volume Attachment

En este caso es cómo asociamos el volumen a la VPS.


resource "digitalocean_volume_attachment" "web" {
droplet_id = digitalocean_droplet.web.id
volume_id = digitalocean_volume.web.id
}

Cuando arraquemos la VPS tendremos el volumen montado en la ruta /mnt/demo_web_volume es decir, el nombre que le hayamos dado al volumen

Outputs/salidas

Para gestionar el acceso la máquina y los datos principales definiremos varias salidas o outputs:

output "ip" {
value = "${digitalocean_droplet.web.ipv4_address}"
}
output "ram" {
value = "${digitalocean_droplet.web.size}"
}
output "vps-disk" {
value = "${digitalocean_droplet.web.disk}"
}
output "volume_disk" {
value = "${digitalocean_volume.web.size}"
}

Ahora ya sólo nos faltaría hacer los pasos de siempre:

  • $ terraform validate
  • $ terraform plan
  • $ terraform apply
  • y para borrar la infraestrcutura $ terraform destroy

 

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.