Je configure mes serveurs avec fabric et fabtools

Ronan Amicel
Ronan AmicelEntrepreneur – Startup advisor – Full-stack Python developer at Omixy
Je configure mes serveurs
  avec fabric et fabtools
              Ronan Amicel
                 @amicel

    PyCon FR – Paris – 15 septembre 2012
Ronan Amicel

• Entrepreneur
• Startup advisor
• Python !
Du serveur au service

                   - +                                                  Apirak.com                                                                         +
                                                                                                                       Home | Login | Register | Contact




                                                                                                   Buy content
                                My Website



                         Blog                                  Forun
                         “RDX Wall Art: The Making Of” is a    - “RDX Wall Art: The Making Of” iand new short
                         new short documentary highlighting    documentary iand new short isa new short
                                                               - isa new short documentary
                                                               - highlighting iand new sho documentary
                         some of the pioneers highlighting     - some of the pioneers highlighting iand new sho
                         more ...                              more ...




    +          =
                         Media Archive
                                                                                                                     Ads
                                                                                                                  by Google




                                                                             Note here


                                                Pages 1 2 3 4 5 6 7 . . . 120 121 122
Configuration du serveur
• Installer des packages       • Créer des répertoires
• Configurer le noyau           • Créer des groupes
• Configurer le firewall         • Créer des utilisateurs
• Configurer un serveur web     • Modifier des permissions
• Configurer un serveur SMTP    • Activer/désactiver des services
• Créer des bases de données   • Créer des tâches périodiques
Déployer une appli
Déployer une appli
• Déploiement initial
  – Installer le code

  – Installer les dépendances

  – Créer la base de données

  – Configurer le serveur web

  – Lancer l'appli
Déployer une appli
• Déploiement initial           • Déploiements ultérieurs
  – Installer le code             – Mettre à jour le code

  – Installer les dépendances     – Mettre à jour les dépendances

  – Créer la base de données      – Migrer le schéma de données

  – Configurer le serveur web      – Relancer l'appli

  – Lancer l'appli
Approches et outils
                               Automatisé
Manuel                         Répétable
                                Scalable
Approches et outils
                               Automatisé
Manuel                         Répétable
                                Scalable




 ssh
Approches et outils
                               Automatisé
Manuel                         Répétable
                                Scalable




 ssh      scripts
           shell
Approches et outils
                               Automatisé
Manuel                         Répétable
                                Scalable




 ssh      scripts   fabric
           shell
C’est quoi fabric ?
    « Une bibliothèque Python (2.5+)
   et un outil en ligne de commande
     qui simplifie l’utilisation de SSH
  pour le déploiement d’applications
et les tâches d’administration système. »
Concrètement
•   Un outil en ligne de commande

         $ fab


•   Une bibliothèque pour aider à écrire son « fabfile.py »

         from fabric.api import run

         def hello():
             run('echo hello')
fabfile.py
from fabric.api import *

def hello(name):
    run('echo Hello %s' % name)

def toto():
    with cd('/tmp'):
        run('touch toto.txt')

def setup():
    sudo('apt-get install python')
fab
$ fab -l
Available commands:

    hello
    uptime
    setup

$ fab -H ronan@server1 hello:name=Ronan
[server1] run: echo Hello Ronan
[server1] out: Hello Ronan

Done.
Disconnecting from server1... done.
Définir les hôtes cibles (1)
from fabric.api import *

def deploy():
    # ...


$ fab -H server1 deploy


$ fab -H server1,server2 deploy
Définir les hôtes cibles (2)
from fabric.api import *

env.hosts = ['server1', 'server2']

def deploy():
    # ...



$ fab deploy
Définir les hôtes cibles (3)
from fabric.api import *

def staging():
    env.hosts = ['staging']

def production():
    env.hosts = ['prod1', 'prod2']


$ fab staging deploy
$ fab production deploy
fabric core
• Opérations              • Context managers
  – run(), sudo()           – cd(), lcd()

  – local()                 – path()

  – get(), put()            – prefix()

  – local()                 – settings()

  – reboot()                – hide(), show()
fabric contrib
• append()                 • upload_template()
• comment(), uncomment()   • upload_project()
• contains()               • rsync_project()
• exists()
• first()
• sed()
Les + et les -
• Les bons côtés
  – on écrit du Python, pas des scripts shell
  – modulable, simple et efficace

• Les manques
  – ça reste assez bas niveau
  – peu de primitives pour manipuler fichiers, utilisateurs...
fabtools
•   fabtools

    – ensemble de primitives pour les scripts fabric

    – tâches courantes : utilisateurs, fichiers, paquets, etc.

•   fabtools.require

    – configuration déclarative vs. impérative

    – inspiré par des outils comme Chef ou Puppet... en plus léger
Approches et outils
                               Automatisé
Manuel                         Répétable
                                Scalable




 ssh      scripts   fabric
           shell
Approches et outils
                                 Automatisé
Manuel                           Répétable
                                  Scalable




 ssh      scripts   fabric    Chef,
           shell             Puppet...
Approches et outils
                                              Automatisé
Manuel                                        Répétable
                                               Scalable




 ssh      scripts   fabric     fabric      Chef,
           shell             + fabtools   Puppet...
Paquets Debian / Ubuntu ?

from fabtools import require

def require_packages():

   # J'ai besoin de ces paquets Debian/Ubuntu
   require.deb.packages([
       'imagemagick',
       'libxml2-dev',
   ])
Paquets tiers ?

from fabtools import require

def require_mongo():

   # Dépôt MongoDB officiel
   require.deb.source('mongodb',
       'http://downloads-distro.mongodb.org/repo/ubuntu-upstart',
       'dist', '10gen')

   # Paquet MongoDB
   require.deb.package('mongodb')
Serveur SMTP ?


from fabtools import require

def require_smtp():

   # J'ai besoin d'un serveur SMTP
   require.postfix.server('example.com')
Base de données ?

from fabtools import require

def require_db():

   # J'ai besoin d'une base PostgreSQL
   require.postgres.server()
   require.postgres.user('myuser', 's3cr3tp4ssw0rd')
   require.postgres.database('myappsdb', 'myuser')
Paquets Python ?
from fabtools.python import virtualenv
from fabtools import require

def python_packages():

    # Je veux que ce paquet soit installé globalement
    require.python.package('lxml', use_sudo=True)

   # Je veux un virtualenv
   require.python.virtualenv('venv')

    # Je veux que ces paquets soient installés dans le virtualenv
    with virtualenv('venv'):
        require.python.packages(['pyramid', 'gunicorn'])
Lancer un processus ?

from fabtools import require

def process():

   # J'ai besoin d'un processus supervisor pour mon appli
   require.supervisor.process('myapp',
       command='/home/bob/venv/bin/gunicorn_paster production.ini',
       directory='/home/bob/myapp',
       user='bob'
   )
Un serveur web en frontal ?

from fabtools import require

def nginx_proxy():

   # J'ai besoin d'un serveur nginx en proxy devant mon appli
   require.nginx.proxied_site('example.com',
       docroot='/home/bob/myapp/public',
       proxy_url='http://127.0.0.1:8888'
   )
Ressources

•   Fabric :

    – http://fabfile.org/

•   Fabtools :

    – http://pypi.python.org/pypi/fabtools

    – https://github.com/ronnix/fabtools
1 of 33

More Related Content

What's hot(15)

Javascript proprementJavascript proprement
Javascript proprement
Guillaume Collic1K views
Les Promises en JavascriptLes Promises en Javascript
Les Promises en Javascript
Benoit Zohar2.3K views
Ze cloud   azure camp - 26 septembreZe cloud   azure camp - 26 septembre
Ze cloud azure camp - 26 septembre
Aymeric Weinbach1.6K views
Présentation de Node.jsPrésentation de Node.js
Présentation de Node.js
Mickael Couzinet1.4K views
Initiation à Express jsInitiation à Express js
Initiation à Express js
Abdoulaye Dieng2.5K views
Vagrant - ConceptVagrant - Concept
Vagrant - Concept
Julien Dubreuil2.2K views
Bonnes pratiques développement androidBonnes pratiques développement android
Bonnes pratiques développement android
Daniel Rene FOUOMENE PEWO1.4K views
Présentation de nodejsPrésentation de nodejs
Présentation de nodejs
13p1.3K views
Présentation de VagrantPrésentation de Vagrant
Présentation de Vagrant
clmntlxndr2.5K views
Rust my nodeRust my node
Rust my node
Thomas Haessle101 views
20111006 bonnes pratiques-gi_g_v120111006 bonnes pratiques-gi_g_v1
20111006 bonnes pratiques-gi_g_v1
Gilles Guirand2.5K views

Similar to Je configure mes serveurs avec fabric et fabtools(20)

Je configure mes serveurs avec fabric et fabtools

  • 1. Je configure mes serveurs avec fabric et fabtools Ronan Amicel @amicel PyCon FR – Paris – 15 septembre 2012
  • 2. Ronan Amicel • Entrepreneur • Startup advisor • Python !
  • 3. Du serveur au service - + Apirak.com + Home | Login | Register | Contact Buy content My Website Blog Forun “RDX Wall Art: The Making Of” is a - “RDX Wall Art: The Making Of” iand new short new short documentary highlighting documentary iand new short isa new short - isa new short documentary - highlighting iand new sho documentary some of the pioneers highlighting - some of the pioneers highlighting iand new sho more ... more ... + = Media Archive Ads by Google Note here Pages 1 2 3 4 5 6 7 . . . 120 121 122
  • 4. Configuration du serveur • Installer des packages • Créer des répertoires • Configurer le noyau • Créer des groupes • Configurer le firewall • Créer des utilisateurs • Configurer un serveur web • Modifier des permissions • Configurer un serveur SMTP • Activer/désactiver des services • Créer des bases de données • Créer des tâches périodiques
  • 6. Déployer une appli • Déploiement initial – Installer le code – Installer les dépendances – Créer la base de données – Configurer le serveur web – Lancer l'appli
  • 7. Déployer une appli • Déploiement initial • Déploiements ultérieurs – Installer le code – Mettre à jour le code – Installer les dépendances – Mettre à jour les dépendances – Créer la base de données – Migrer le schéma de données – Configurer le serveur web – Relancer l'appli – Lancer l'appli
  • 8. Approches et outils Automatisé Manuel Répétable Scalable
  • 9. Approches et outils Automatisé Manuel Répétable Scalable ssh
  • 10. Approches et outils Automatisé Manuel Répétable Scalable ssh scripts shell
  • 11. Approches et outils Automatisé Manuel Répétable Scalable ssh scripts fabric shell
  • 12. C’est quoi fabric ? « Une bibliothèque Python (2.5+) et un outil en ligne de commande qui simplifie l’utilisation de SSH pour le déploiement d’applications et les tâches d’administration système. »
  • 13. Concrètement • Un outil en ligne de commande $ fab • Une bibliothèque pour aider à écrire son « fabfile.py » from fabric.api import run def hello(): run('echo hello')
  • 14. fabfile.py from fabric.api import * def hello(name): run('echo Hello %s' % name) def toto(): with cd('/tmp'): run('touch toto.txt') def setup(): sudo('apt-get install python')
  • 15. fab $ fab -l Available commands: hello uptime setup $ fab -H ronan@server1 hello:name=Ronan [server1] run: echo Hello Ronan [server1] out: Hello Ronan Done. Disconnecting from server1... done.
  • 16. Définir les hôtes cibles (1) from fabric.api import * def deploy(): # ... $ fab -H server1 deploy $ fab -H server1,server2 deploy
  • 17. Définir les hôtes cibles (2) from fabric.api import * env.hosts = ['server1', 'server2'] def deploy(): # ... $ fab deploy
  • 18. Définir les hôtes cibles (3) from fabric.api import * def staging(): env.hosts = ['staging'] def production(): env.hosts = ['prod1', 'prod2'] $ fab staging deploy $ fab production deploy
  • 19. fabric core • Opérations • Context managers – run(), sudo() – cd(), lcd() – local() – path() – get(), put() – prefix() – local() – settings() – reboot() – hide(), show()
  • 20. fabric contrib • append() • upload_template() • comment(), uncomment() • upload_project() • contains() • rsync_project() • exists() • first() • sed()
  • 21. Les + et les - • Les bons côtés – on écrit du Python, pas des scripts shell – modulable, simple et efficace • Les manques – ça reste assez bas niveau – peu de primitives pour manipuler fichiers, utilisateurs...
  • 22. fabtools • fabtools – ensemble de primitives pour les scripts fabric – tâches courantes : utilisateurs, fichiers, paquets, etc. • fabtools.require – configuration déclarative vs. impérative – inspiré par des outils comme Chef ou Puppet... en plus léger
  • 23. Approches et outils Automatisé Manuel Répétable Scalable ssh scripts fabric shell
  • 24. Approches et outils Automatisé Manuel Répétable Scalable ssh scripts fabric Chef, shell Puppet...
  • 25. Approches et outils Automatisé Manuel Répétable Scalable ssh scripts fabric fabric Chef, shell + fabtools Puppet...
  • 26. Paquets Debian / Ubuntu ? from fabtools import require def require_packages(): # J'ai besoin de ces paquets Debian/Ubuntu require.deb.packages([ 'imagemagick', 'libxml2-dev', ])
  • 27. Paquets tiers ? from fabtools import require def require_mongo(): # Dépôt MongoDB officiel require.deb.source('mongodb', 'http://downloads-distro.mongodb.org/repo/ubuntu-upstart', 'dist', '10gen') # Paquet MongoDB require.deb.package('mongodb')
  • 28. Serveur SMTP ? from fabtools import require def require_smtp(): # J'ai besoin d'un serveur SMTP require.postfix.server('example.com')
  • 29. Base de données ? from fabtools import require def require_db(): # J'ai besoin d'une base PostgreSQL require.postgres.server() require.postgres.user('myuser', 's3cr3tp4ssw0rd') require.postgres.database('myappsdb', 'myuser')
  • 30. Paquets Python ? from fabtools.python import virtualenv from fabtools import require def python_packages(): # Je veux que ce paquet soit installé globalement require.python.package('lxml', use_sudo=True) # Je veux un virtualenv require.python.virtualenv('venv') # Je veux que ces paquets soient installés dans le virtualenv with virtualenv('venv'): require.python.packages(['pyramid', 'gunicorn'])
  • 31. Lancer un processus ? from fabtools import require def process(): # J'ai besoin d'un processus supervisor pour mon appli require.supervisor.process('myapp', command='/home/bob/venv/bin/gunicorn_paster production.ini', directory='/home/bob/myapp', user='bob' )
  • 32. Un serveur web en frontal ? from fabtools import require def nginx_proxy(): # J'ai besoin d'un serveur nginx en proxy devant mon appli require.nginx.proxied_site('example.com', docroot='/home/bob/myapp/public', proxy_url='http://127.0.0.1:8888' )
  • 33. Ressources • Fabric : – http://fabfile.org/ • Fabtools : – http://pypi.python.org/pypi/fabtools – https://github.com/ronnix/fabtools