SecNot

jul 08, 2015

Crea un servicio de Hosting VPS con Django I

Este es el primer artículo de una series en la que describo como usar Django en conjunción con DigitalOcean para crear tu propio proveedor de de servidores VPS. Algo que hace años hubiera sido impensable sin un equipo de administradores y programadores, y que hoy puede implementarse con unos pocos miles de lineas de código python.

Este artículo es una introducción al API de DigitalOcean y a su libreria de python, la cual usaré en futuros artículos para implementar el servicio.

API de DigitalOcean

El API de Digitalocean actualmente se encuentre en su segunda versión y es muy extenso, no solo permite crear, destruir, y manejar Droplets (nombre que usa para sus VPS), sino que permite controlar todos los aspectos de sus servicios, desde la gestión de DNS, hasta la creación backups, o gestión imágenes. Puede acceder a la documentación del API aquí pero por suerte ya existe una libreria para python llamada python-digitalocean que simplifica enormemente el proceso, crear un Droplet puede ser tan sencillo como:

import digitalocean
droplet = digitalocean.Droplet(token="digitalocean-personal-access-token",
                           name='servidor.midominio.com',
                           region='ams2', # Amsterdam
                           image='ubuntu-14-04-x64', # Ubuntu 14.04 x64
                           size_slug='512mb')
droplet.create()
droplet_id = droplet.id

El identificador devuelto durante la creación del Droplet luego puede ser usado para manejarlo, en el siguiente ejemplo se reinicia, apaga y después elimina:

import digitalocean

manager = digitalocean.Manager(token="digitalocean-personal-access-token")
droplet = manager.get_droplet(droplet_id)

droplet.reboot()
droplet.power_off()
droplet.destroy()

La librería también permite redirigir dominios gestionados desde la DNS de DigitalOcean, por ejemplo si tienes la dirección IP y el hostname de un Droplet puedes redirigir un subdominio:

import digitalocean
import tldextract

droplet_ip = "83.54.134.34"
droplet_hostname = "servidor.midominio.com"

# Crear subdominio usando el hostname del servidor
d_subdomain, d_domain, d_suffix = tldextract.extract(droplet_hostname)

domain = digitalocean.Domain(token="digitalocean-personal-access-token",
                            name=d_domain+"."+d_suffix)

result = domain.create_new_domain_record(type="A", name=d_subdomain, data=droplet_ip)

domain_record_id = result['domain_record']['id']

# Eliminar registro creado
record = digitalocean.Record(
            id=domain_record_id,
            domain_name=d_domain+"."+d_suffix,
            token="digitalocean-personal-access-token")

record.destroy()

Y con esto tenemos los fundamentos para manejar Droplets, pero antes de poder entregarlo al usuario es necesario configurarlo/customizarlo al gusto del usuario.

Metadata y Cloudinit

DigitalOcean incluye un API de Metadatos, que permite a los Droplets acceder a sus propios datos, suministrar datos de usuario durante su creación, y procesar esos datos usando CloudInit si es que contienen alguno de los formatos soportados. En el siguiente ejemplo se envía una cadena que contiene dos variables:

import digitalocean

data = 'USUARIO="admin"\nCLAVE="secreto"'

droplet = digitalocean.Droplet(token=settings.DIGITALOCEAN_SECRET_TOKEN,
                           name='servidor.midominio.com',
                           region='ams2', # Amsterdam
                           image='ubuntu-14-04-x64',
                           size_slug='512mb',
                           user_data=data)
droplet.create()
droplet_id = droplet.id

Desde el droplet se puede acceder a los datos suministrados:

$ curl -sS http://169.254.169.254/metadata/v1/user-data
USUARIO="admin"
CLAVE="secreto"

CloudInit como su nombre indica es una herramienta para inicializar servidores en la nube, la primera vez que arranca el servidor extrae los datos de configuración, y si contienen alguno de los formatos soportados los procesa. Uno de esos formatos es shell script, por ejemplo podemos enviar el siguiente script para crear un archivo de swap de 2GB:

#!/bin/bash
fallocate -l 2G /swapfile
chmod 600 /swapfile
mkswap /swapfile
echo '/swapfile none swap sw 0 0' >>/etc/fstab

Cloud Config es otro formato muy versátil, que permite realizar la mayoría de las tareas más comunes de configuración de forma muy sencilla, y ademas proporciona funcionalidad extra con su sistema de módulos, en el siguiente ejemplo se añade los mismos 2GB de swap:

#cloud-config
swap:
    filename: /swapfile
    size: 2000000000

Por último el formato Include File consiste en una lista de URLS cuyo contenido es descargado y procesado usando las mismas reglas que si fueran los datos proporcionados con user-data, por ejemplo:

#include
https://myvpsservice.com/scripts/swap-2GB
https://myvpsservice.com/scripts/install-apache
https://myvpsservice.com/scripts/add-keys

Seguro que puedes ver el potencial de éste formato para esta aplicación. Si te interesa conocer el resto de los formatos y módulos disponibles te recomiendo que heches un vistazo a la documentación de cloud-init.

En la segunda parte de esta serie profundizare más en como implementar un sistema de configuración de VPS con Django.

Click to read and post comments