Fantomas’side

Weblog open-source

Paye ta Fabric !

Le déploiement d'applications, c'est pas toujours facile et rébarbatif surtout quand on travaille sur un parc de machines.

Imaginons que j'utilise un serveur de version, du genre Subversion ou Mercurial et que j'utilise un ou deux serveurs (test, production 1, production 2, ...) pour héberger mon ou mes applications.

Le déroulement est le suivant :

  • Développement en local.
  • Propagation des modifications.
  • Connection SSH sur les serveurs.
  • Rapatriement les dernières modifications
  • On redémarre le soft.

Vous me direz que cela n'est pas forcément très long, mais quand vous devez le faire souvent et plusieurs fois par jour, on en a vite pleins le dos et cela est source d'erreur.

Heureusement l'informatique étant un sport où celui qui est le plus fainéant gagne, il existe un solution pour se simplifier ces tâches de déploiements à distance.

Son nom ? Fabric

En quelques lignes de Python, définissant des règles, un peu à la manière d'un Makefile, il est possible d'automatiser ce genre d'opération.

Voici un exemple basique pour le déployement d'un projet Django avec Mercurial :

"""Fabric Rules for MyProject"""

config.production = ['server.domain.com']
config.app_dir = '/home/dev/djangos/myproject'

def publish():
    """Publish the content by pushing it"""
    local('hg push')

def apache_reload():
    """Reload the apache process"""
    sudo('/etc/init.d/apache2 reload')

@roles('production')
def update():
    """Update the code source"""
    run('cd $(app_dir); hg pull; hg update')
    run('cd $(app_dir); python manage.py syncdb')
    run('cd $(app_dir); python manage.py loaddata my_dump.json')
    apache_reload()

@roles('production')
def debug_on():
    """Turn debug mode on for the production server."""
    run("cd $(app_dir); sed -i -e 's/DEBUG = .*/DEBUG = True/' settings.py")
    apache_reload()

@roles('production')
def debug_off():
    """Turn debug mode off for the production server."""
    run("cd $(app_dir); sed -i -e 's/DEBUG = .*/DEBUG = False/' settings.py")
    apache_reload()

@depends(publish, update)
def deploy():
    """Deploy the website."""
    pass

Un des avantages principaux de Fabric est qu'il est possible de l'utiliser sur plusieurs serveurs en même temps, avec des règles spécifiques.

On lance Fabric, et on peut aller prendre un café. :D

Pour information Fabric est basé sur Capistrano, le même principe mais en Ruby.

Un must, à tester absolument.

Edit : le site du projet Fabric