Batou ist ein Open-Source Werkzeug um mit Python das Deployment von komplexen Anwendungen zu beschreiben und zu automatisieren.
Das Konzept besteht darin eine passende allgemeine Modellsprache in Form einer API zu definieren. Dabei stehen Wiederverwendung, Toleranz gegenüber unbekannten Zuständen und Ausdrucksstärke im Vordergrund.
Der Vortrag zeigt den Werdegang und unsere Motivation zur Entwicklung von batou auf und zeigt die konzeptionellen Stärken anhand praktischer Beispiele.
Wir haben in den letzten Jahren eine Reihe großer und kleiner Projekte beim Deployment betreut.
Im Rahmen unserer Plattform "gocept.net" bereiten wir unsere Erfahrungen in Dokumentation und offenen Werkzeugen auf und haben daher batou entwickelt.
batou ist sowohl in Python geschrieben und nutzt Python um Deployment-Strukturen zu beschreiben.
Wir möchten Batou gerne vorstellen um unsere Erfahrungen weiterzugeben und (auch auf den Sprints) anzuregen sich mit dem Werkzeug auseinanderzusetzen, Feedback zu bekommen, und daran weiterzuarbeiten.
Siehe auch: http://bitbucket.org/gocept/batou
11. PARTY LIKE ITS ...
• 1999: PHP FTP-Uploads
• 2001: Shell-Skripte um Zope-Instanzen zu verwalten
• 2003: Zope 2.4 “mkinstance”
• 2006: zc.buildout
• 2009: Fabric
Wednesday, October 31, 12
12. BATOU
VS
Puppet, Chef Fabric, Salt JuJu
Systemkonfiguration
versus Service Modellierung Laufzeitumgebung
deployment
Wednesday, October 31, 12
13. HELLO WORLD
http://www.flickr.com/photos/oskay/472097903
Wednesday, October 31, 12
20. $ cat "foo" > work/hello/hello
$ bin/batou-local dev localhost
Updating Hello > File(hello) > Content(hello)
Wednesday, October 31, 12
21. [environment]
service_user = test
host_domain = gocept.net
[hosts]
test01 = hello
test02 = hello
environments/prod.cfg
Wednesday, October 31, 12
22. $ bin/batou-remote prod
test02.gocept.net: connecting
test01.gocept.net: connecting
test01.gocept.net: bootstrapping
test02.gocept.net: bootstrapping
OK
OK
Deploying test01.gocept.net/hello
Updating Hello > File(hello) > Presence(hello)
Updating Hello > File(hello) > Content(hello)
OK
Deploying test02.gocept.net/hello
Updating Hello > File(hello) > Presence(hello)
Updating Hello > File(hello) > Content(hello)
OK
Wednesday, October 31, 12
23. $ bin/batou-remote prod
test02.gocept.net: connecting
test01.gocept.net: connecting
test01.gocept.net: bootstrapping
test02.gocept.net: bootstrapping
OK
OK
Deploying test01.gocept.net/hello
OK
Deploying test02.gocept.net/hello
OK
Wednesday, October 31, 12
24. HELLO WORLD
• Komponenten und Environments
• batou-local im Konfiguration eines Hosts lokal zu realisieren
• batou-remote um eine ganze Umgebung zu deployen
• Konvergenz und Idempotenz
Wednesday, October 31, 12
25. IN DEN KANINCHENBAU
• ein Programm
• verwaltet mit Supervisor
Wednesday, October 31, 12
26. DAS PROGRAMM
#!/usr/bin/env python
import time
while True:
print 'Hello, world!'
time.sleep(1)
Wednesday, October 31, 12
27. KOMPONENTE
from batou.component import Component
from batou.lib.file import File
class Hello(Component):
def configure(self):
self += File('hello',
source='hello.py',
mode=0o755)
components/hello/component.py
Wednesday, October 31, 12
37. SERVER-ADRESSE
from batou.component import Component
from batou.lib.buildout import Buildout
from batou.utils import Address
class Supervisor(Component):
port = 9000
def configure(self):
self.address = Address(
self.host.fqdn, self.port)
self += Buildout('supervisor',
python='2.7')
components/supervisor/component.py
Wednesday, October 31, 12
38. SERVER-ADRESSE
[hosts]
localhost = program, supervisor
[component:supervisor]
port = 6000
environments/dev.cfg
Wednesday, October 31, 12
39. WELCHE PROGRAMME
STARTEN?
from batou.component import Component
from batou.lib.file import File
class Hello(Component):
def configure(self):
self += File('hello',
source='hello.py', mode=0o755)
self.provide('program',
'{}/hello'.format(self.workdir))
components/hello/component.py
Wednesday, October 31, 12
40. WELCHE PROGRAMME
STARTEN?
class Supervisor(Component):
def configure(self):
self.programs = self.require(
w
'program', host=self.host)
self += Buildout('supervisor',
python='2.7')
components/supervisor/component.py
Wednesday, October 31, 12
41. WELCHE PROGRAMME
STARTEN?
[buildout]
parts = supervisor
[supervisor]
recipe = collective.recipe.supervisor
port = {{component.address.listen}}
serverurl = ...
programs =
{%- for program in component.programs %}
{{loop.index0}} prog{{loop.index}}
{{program}} true
{% endfor -%}
components/supervisor/buildout.cfg
Wednesday, October 31, 12
42. RESSOURCEN UND
ABHÄNGIGKEITEN
• provide(key, value)
• require(key, host=None) => [x, y, z]
• require_one(key, host=None) => x
Wednesday, October 31, 12
43. RESSOURCEN UND
ABHÄNGIGKEITEN
• provide ohne require
• require ohne provide
• require_one mit != 1 Element
• Flapping durch Sortieren vermeiden.
• Dependencies werden automatisch gefunden
Wednesday, October 31, 12
44. HOOK KOMPONENTEN
from batou.component import Component
from batou.lib.file import File
class Hello(Component):
def configure(self):
self += File('hello',
source='hello.py', mode=0o755)
self += Program('hello', command='hello')
components/hello/component.py
Wednesday, October 31, 12
46. HOOK COMPONENTS
class Program(HookComponent):
key = 'supervisor:Program' Kann eigentlich nicht
... hier leben - muss
importierbar sein!
class Supervisor(Component):
def configure(self):
self.programs = self.require(
Program.key, host=self.host)
self += Buildout('supervisor',
python='2.7')
components/supervisor/component.py
Wednesday, October 31, 12
47. WELCHE PROGRAMME
STARTEN
[buildout]
parts = supervisor
[supervisor]
recipe = collective.recipe.supervisor
port = {{component.address.listen}}
serverurl = ...
programs =
{%- for program in component.programs %}
{{loop.index0}} {{program.format}}
{% endfor -%}
components/supervisor/buildout.cfg
Wednesday, October 31, 12
53. TIPPS
• Komponenten unabhängig von Host
• Gemeinsamkeiten in Komponenten bündeln
• verify/update so kurz wie nur möglich
• je abstrakter eine Komponente desto unwarscheinlicher trifft
man verify/update
Wednesday, October 31, 12
54. VORDEFINIERTE
KOMPONENTEN
File VirtualEnv Buildout zip
Secrets Supervisor Download CMMI
git svn tar cron
Wednesday, October 31, 12
55. FAZIT
• modell-getrieben aber pragmatisch
• Konvergenz und Idempotenz
• Der Teufel liegt im Detail. Immer wieder.
Wednesday, October 31, 12
56. AUSSICHT
• Dokumentation
• Bessere Fehlermeldungen
• Besserer Status-Output
• Alternativen zu SSH/HG
Wednesday, October 31, 12