Comunidad de diseño web y desarrollo en internet

Automatizar tareas con Nginx y Fabric

Después de dar nuestros primeros pasos con Nginx, debemos crecer un poco y ver más allá de simples comandos en la consola de Linux. Cuando se está desplegando una aplicación web uno hace casi todo manual, se imaginan, tener más de dos servidores donde se deba hacer exactamente lo mismo... Sería bastante fastidioso; pero gracias a muchos colaboradores en la red, existen softwares que permiten automatizar tareas.



Los más populares son Puppet, Fabric y Capistrano. Aprendiendo a usar alguno de estos softwares uno puede ahorrarse mucho tiempo automatizando tareas repetitivas.

Aprende uno de esos software y...



Este post se enfocará en Fabric y la configuración de Nginx de manera automática con un fabfile.

¿Qué es Fabric?


Fabric es una librería para Python y línea de comandos para coordinar el uso de SSH para implementación de aplicaciones o tareas de administración de sistemas.

¿Por qué usar Fabric?

Usar Fabric, o algún otro programa de automatización de tareas locales o remotas ayuda a ahorrar mucho tiempo y... el tiempo es oro.

Diferencias entre Fabric, Puppet y Capistrano

Básicamente todos hacen lo mismo, pero se diferencian primero en los lenguajes que usan: Fabric usa Python, Puppet usa Puppet (Si así también se llama el lenguaje que usa, inspirado en Ruby) y Capistrano usa Ruby; por lo demás los métodos que utiliza, y cómo se ejecutan las tareas.

¿Qué sistemas operativos soportan Fabric?

Todos los que soporten Python 2.5.

Instalar Fabric


Para instalar Fabric se puede hacer a través de pip o mejor aún, los repositorios oficiales (en el caso de GNU/Linux).

En distribuciones basadas en Red Hat:

Código :

# yum install fabric


En distribuciones basadas en Debian:

Código :

# apt-get install fabric


Fabfile


Para comenzar a realizar nuestras tareas, debemos crear un archivo (en cualquier directorio) llamado fabfile.py.

Código :

$ mkdir fabric
$ touch fabfile.py


En ese archivo definirán todas las tareas que deseen realizar. Un ejemplo puede ser:

Código :

from fabric.api import task, run


@task
def informacion_sistema():
    run('uname -a')


En la misma carpeta donde se sitúa el archivo verificamos la tarea con la herramienta "fab"

Código :

$ fab --list
Available commands:

    informacion_sistema


Para ejecutar esa tarea utilizamos el comando fab, especificando en qué host vamos a trabajar.

Código :

$ fab -H localhost informacion_sistema
[localhost] Executing task 'informacion_sistema'
[localhost] run: uname -a
[localhost] Login password for 'yograterol': 
[localhost] out: Linux openstack.localdomain 3.12.6-200.fc19.x86_64 #1 SMP Mon Dec 23 16:33:38 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
[localhost] out: 
Done.
Disconnecting from localhost... done.


Como se menciona en la definición de Fabric, utiliza SSH para realizar las tareas, ya sea en local o en remoto. Para no tener que colocar la contraseña cada vez que ejecutemos la tarea, podemos definir el usuario y la contraseña con la que deseamos conectarnos al SSH (Lo recomendable es trabajar con llaves privadas).

Para definir el usuario y contraseña se importa env. El código ahora quedará así:

Código :

from fabric.api import task, run, env

env.user = 'yograterol'
env.password = 'tu contraseña aquí'
env.hosts = ['localhost', ]


@task
def informacion_sistema():
    run('uname -a')


Ahora la ejecución es más sencilla, no necesitamos colocar la contraseña, ni el usuario o host. Aquí el resultado:

Código :

$ fab informacion_sistema      
[localhost] Executing task 'informacion_sistema'
[localhost] run: uname -a
[localhost] out: Linux openstack.localdomain 3.12.6-200.fc19.x86_64 #1 SMP Mon Dec 23 16:33:38 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
[localhost] out: 
Done.
Disconnecting from localhost... done.


¿Si necesito ejecutar un comando con privilegios utilizo run()?


No, en la API de Fabric, existe un comando llamado sudo, con ese comando realizan las tareas con privilegios. (Siempre y cuando el usuario tenga dichos privilegios).

Fabric y Nginx


En el post sobre primeros pasos con Nginx expliqué como realizar la instalación de Nginx y modificar la página de prueba, esta vez le presento el script que hace todo automáticamente con Fabric.

Creamos un fabfile.py con el siguiente contenido.

Código :

import tempfile
from fabric.api import env, run, cd, sudo, put

env.user = 'tu usuario'
env.password = 'tu contraseña'
env.hosts = ['localhost', ]

nginx_default = """
server {
    listen       80 default_server;
    server_name  _;

    location / {
        root   /srv/www/cristalab;
        index  index.html index.htm;
    }

    error_page  404              /404.html;
    location = /404.html {
        root   /usr/share/nginx/html;
    }

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}
"""


def run_nginx():
    sudo('service nginx restart')


def create_nginx_site():
    temp_file = tempfile.mktemp('.conf')
    with open(temp_file, 'w+') as output:
        output.write(nginx_default)
    put(temp_file, '/etc/nginx/conf.d/default.conf', use_sudo=True)
    run_nginx()


def create_index():
    with cd('/srv/www/cristalab'):
        run('touch index.html')
        run('echo "Hola mundo" >> index.html')
    create_nginx_site()


def change_perm():
    sudo('chown nginx.nginx /srv/www')
    sudo('chown yograterol.nginx /srv/www/cristalab')
    create_index()


def create_location_root():
    sudo('mkdir -p /srv/www/cristalab')
    change_perm()


def add_user_group():
    sudo('usermod -g nginx yograterol')
    create_location_root()


def install_nginx():
    sudo('yum install nginx -y')
    add_user_group()


def deploy():
    install_nginx()


Y ejecutamos:

Código :

$ fab deploy


Obteniendo como resultado la instalación y configuración de Nginx con un sitio y contenido. Ese archivo se puede ejecutar N veces en M servidores con distribuciones derivadas en Red Hat y el resultado será el mismo, para Debian y otras distros solo deben modificar algunas cosas.

Ahora dejo a su imaginación el uso que le pueden dar a herramientas potentes como ésta.

¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.

Publica tu comentario

o puedes...

¿Estás registrado en Cristalab y quieres
publicar tu URL y avatar?

¿No estás registrado aún pero quieres hacerlo antes de publicar tu comentario?

Registrate