introducción al deploy con fabric

Deploy

  • Un deploy es la acción de poner a funcionar la aplicación en el servidor.
  • Dado que es una tarea repetitiva y que se debe hacer a menudo conviene que ser automática

Deploy manual vs automático

Manual:

$ ssh user@servidor 
$ (password)
$ cd path
$ svn update
$ workon env
$ python manage.py syncdb
$ ...

Automático:

$ fab server deploy

fabric, deploys fáciles

  • fabric es una librería para python y además una herramienta
  • Tiene funcionalidad básica, ejecutar comandos en local/remoto, subir/bajar ficheros, todo usando python
  • se instala como otra librería: pip install fabric

Ejemplo muy simple, ejecutar un comando en remoto:

1 from fabric.api import run
2 
3 def production():
4     env.hosts = ['rambo.elmejor.es']
5     env.user = 'user'  
6     env.password = 'password'
7 
8 def host_type():
9     run('uname -s')

ejecución:

$ fab production host_type

fabric, comandos útiles

Los comandos más útiles son:

local ejecuta un comando en local:

1 local("rm -f file")

run ejecuta un comando en la máquina remota:

1 run("cp f1 f2")

sudo ejecuta un comando en remoto con permisos de root

1 sudo("ifconfig eth0 1.0.0.1")

fabric, otros comandos

put y get para subir y bajar ficheros:

1 put("/home/rambo/custom_settings.py", "/home/deploy/settings.py")
2 get("/tmp/database_dump.tar.gz", "database_dump.tar.gz")
3 local("gzip -d database_dump.tar.gz")

upload_template sube un fichero de texto pero previamente lo genera usando las variables que hay en la variable 'env', por ejemplo:

welcome.txt:

1 Hola, bienvenido a %(host_name)s!

fabfile.py:

1 env.host_name = 'john rambo server'
2 upload_template("welcome.txt", "/var/www/index.html")

Deploy en django, pinceladas

  • WSGI => app.wsgi sistema de comunicación entre servidor web y python
  • virtualhost de apache
  • combo: svn up && manage.py sync && manage.py migrate

Ejemplo deploy muy simple

Este es un ejemplo de un deploy semiautomático, previamente hay que hacer checkout del código y haber puesto el app.wsgi donde corresponda.

fabfile.py:

 1 from fabric.api import env, run, local, sudo
 2 
 3 def production():
 4   env.hosts = ['server.es']
 5   env.user = 'rambo'  
 6   env.password = 'password'
 7   env.deploy_folder = '/var/www/infoserver'
 8 
 9 def deploy():
10   # deploy task need previous svn co into deploy_folder/srv
11   # and app.wsgi
12   run("cd %(deploy_folder)s/srv/ && svn up" % env)
13   run("cd %(deploy_folder)s && touch app.wsgi" % env)