Share
Embed
Transcript
33 slides
-
Je configure mes serveurs avec fabric et fabtools Ronan Amicel
@amicel PyCon FR – Paris – 15 septembre 2012 -
Du serveur au service + = + - + Apirak.com
Ads by Google Pages 1 2 3 4 5 6 7 . . . 120 121 122 Blog “RDX Wall Art: The Making Of” is a new short documentary highlighting some of the pioneers highlighting more ... - “RDX Wall Art: The Making Of” iand new short documentary iand new short isa new short - isa new short documentary - highlighting iand new sho documentary - some of the pioneers highlighting iand new sho more ... Forun Media Archive Home | Login | Register | Contact My Website Buy content Note here -
Configuration du serveur • Installer des packages • Configurer le
noyau • Configurer le firewall • Configurer un serveur web • Configurer un serveur SMTP • Créer des bases de données • Créer des répertoires • Créer des groupes • Créer des utilisateurs • Modifier des permissions • Activer/désactiver des services • Créer des tâches périodiques -
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 – Installer le code
– Installer les dépendances – Créer la base de données – Configurer le serveur web – Lancer l'appli • Déploiements ultérieurs – Mettre à jour le code – Mettre à jour les dépendances – Migrer le schéma de données – Relancer l'appli -
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 • Une
bibliothèque pour aider à écrire son « fabfile.py » $ fab 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) $ fab -H server1 deploy
$ fab -H server1,server2 deploy from fabric.api import * def deploy(): # ... -
Définir les hôtes cibles (2) $ fab deploy from fabric.api
import * env.hosts = ['server1', 'server2'] def deploy(): # ... -
Définir les hôtes cibles (3) $ fab staging deploy $
fab production deploy from fabric.api import * def staging(): env.hosts = ['staging'] def production(): env.hosts = ['prod1', 'prod2'] -
fabric core • Opérations – run(), sudo() – local() –
get(), put() – local() – reboot() • Context managers – cd(), lcd() – path() – prefix() – settings() – hide(), show() -
fabric contrib • append() • comment(), uncomment() • contains() •
exists() • first() • sed() • upload_template() • upload_project() • rsync_project() -
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 Manuel scripts shell Chef, Puppet... ssh Automatisé
Répétable Scalable fabric -
Approches et outils Manuel scripts shell fabric + fabtools Chef,
Puppet... ssh Automatisé Répétable Scalable fabric -
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