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.
Por carlos el 14 de Enero de 2014
https://github.com/sald19/load-Balancing-vagrant-saltstack/
Por yograterol el 14 de Enero de 2014
carlos-blog :
https://github.com/sald19/load-Balancing-vagrant-saltstack/
Claro, entiendo tu punto y existen como mencioné al principio distintos software, y a la final uno elige el que mejor se adapte a nuestras necesidades. Salt usa YAML, y eso en parte limita para algunas cosas. Pero del resto hace su trabajo.
Por Dientuki el 15 de Enero de 2014
Por yograterol el 15 de Enero de 2014
Dientuki :
Claro, SHElL es el lenguaje dominante en todo este mundo... El detalle SON las limitaciones de SHELL con respecto a automatización de múltiples servidores, si tienes 10 servidores a tu cargo, y necesitas hacer la misma tarea en los 10, con Puppet, Fabric u otro, con solo escribir un comando se realizan las tareas en todos los servidores.
Empresas como Google tienen más de 600k servidores, ¿Cuántas personas se necesitarían para administrar todo eso si se hiciera solo con sh?
Por Dientuki el 20 de Enero de 2014