post

DevOps Conference 2015

Die DevOps Conference fand vom 23. –  25.11.2015 in München statt. Insgesamt (bis auf einige schlecht verschraubte Tische) eine sehr gelungene Veranstaltung.

Tag 1

Den Start in die Konferenz bestritt Dr. Roland Huß von RedHat mit einem Überblick über die Google Cloud Platform. Gefolgt von Rainer Stropek der im Vergleich hierzu Microsoft Azure sehr enthusiastisch vorstellte. Alles in allem ein sanfter Einstieg in die Welt der Cloud Plattformen.

Tag 2

An Tag 2 war schon deutlich mehr geboten und auch deutlich mehr Publikum unterwegs. Nach dem Einstieg in die Materie durch John Willis von Docker („Devops state of the union“) bildete Bernhard Cyan etwas den Gegenpol. Das Thema „Delivery Pipelines einfach definieren mit Jenkins Workflow DSL“ mag zwar spannend sein, aber leider kam dies beim Auditorium nicht so ganz an. Da machte es EMC mit einem Vortrag zum persistieren von Daten in Containern mittels „RexRay“ schon deutlich besser.

Nach der Mittagspause bot Bart Butler von ING-DiBa einen Einblick, was man im BigData Umfeld so mit DevOps zu tun hat. Ein echtes Highlight war der Vortrag von Peter Roßbach „Mikroservices mit Docker orchestrieren“. Grundtenor: Monolithische Systeme aufbrechen und in kleine Einheiten aufteilen. Insgesamt gab es einen von Realismus geprägten Ritt durch die Docker Welt von A-Z. Aus meiner Sicht ein guter Überblick. Den Tag beschloss für uns Michael Hausenblas von Mesosphere mit einem Überblick inkl. Demo von eben Mesosphere.

Tag 3

Letzter Tag 3: Der erste Vortrag von Eduards Sizovs „Eight Things that make Continuous Delivery go Nuts“ gab Tips aus der Praxis. In diesem Fall aber primär zur Zusammenarbeit im Team und wie man alle ins Boot holt, ohne einzelne Gruppen hervorzuheben oder andere auf der Strecke zu lassen. Insgesamt ein Thema zur Veränderung von Organisationen. Anschließend gab Erkan Yanar in seiner gewohnt flapsigen Art einen Überblick über etcd. Trotz oder gerade wegen einiger Fallstricke und etwas notwendigem Livedebugging eine launige Session. Von den restlichen Vorträgen des Tages sind aus meiner Sicht noch „I dont care what you did last summer“ von Moritz Heiber (Themen Continous Delivery und Immutable Infrastrcture) sowie der „rkt“ Vortrag von Iago Lopez Galeiras zu nennen. Letzterer gab einen guten Überblick über rkt und dem aktuellen Stand der Entwicklung.

Fazit

Alles in allem eine gute Konferenz mit interessanten Themen. Die Organisation könnte noch etwas lernen (z.B. auf die Zeit achten und Mikros an die Fragesteller im Publikum), aber ansonsten aus meiner Sicht empfehlenswert.

Infrastructure as secure code

Im Rahmen meiner Abschlussarbeit habe ich mich damit beschäftigt den Code des Konfigurationsmanagementsystems Puppet automatisiert auf unsichere Praktiken zu analysieren. Herausgekommen ist ein puppet-lint Plugin zur Prüfung von Puppetcode aus mögliche Sicherheitsrisiken.

Das Plugin steht auf rubygems.org zur Verfügung. Der Quellcode ist auf Github verfügbar. Die eingebauten Sicherheitschecks sind als Basis zu verstehen und sollten auf die eigenen Bedürfnisse angepasst werden. Gerne können und sollten weitere Checks eingebaut werden.

Gem Version

Nun noch ein paar Hintergrundinfos.

Continue reading

post

OpenUp Camp 2015 in Nürnberg

Vom 26. bis 28. März fand in Nürnberg das OpenUp Camp von OpenBIT (ehemals Open Source Business Foundation) statt. Ein kurzer Erfahrungsbericht:

Tag 1

Am ersten Tag fand der Business Day statt, ein klassisches Konferenzformat mit Vorträgen zu verschiedenen Themen. Hier ein paar Highlights:Eröffnungskeynote:

Privacy by design: Humanizing analytics

Marie Wallace von IBM berichtete über People Analytics. Hier werden Mitarbeiter Daten via BigData analysiert. IBM aggregiert und anonymisiert die Daten um diese aus Arbeitgebersicht nutzbar zu machen. Die Mitarbeiter erhalten einen persönlichen Login und können hier ihr persönliches Dashboard mit diversen KPIs sehen. Der Vorteil ist: Jeder Mitarbeiter sieht für sich persönlich ob und wo er sich weiterentwickelt. Der Arbeitgeber kann aus den aggregierten Daten strategische Entscheidungen ableiten. Das ganze bietet natürlich ganz neue Vorteile sowohl für Arbeitgeber und -nehmer. Allerdings, sobald die Daten der Mitarbeiter erst einmal gesammelt sind, ist der Weg zum Missbrauch nicht mehr weit. Das ganze sollte als kritisch hinterfragt und diskutiert werden.

Ist vernetztes Arbeiten die Arbeitsformel der Zukunft?

Peter Fischer zeigt das von Microsoft gezeichnete ein Bild der zukünftigen Arbeitswelt. Der Trend geht zum vernetzten Arbeiten ohne Zwang den Arbeitstag im Büro zu verbringen. Die Zukunftsvision von Microsoft ist durchaus sehenswert:

Keynote: Big Data Analytics

Prof. Dieter Kempf (Vorstandsvorsitzender der Datev und Präsident des Branchenverbands BITKOM) sprach unter anderem über den Grundsatz der Datensparsamkeit in Deutschland und sprach sich dafür aus diesen fallen zu lassen. Stattdessen soll in Zukunft jeder seine Daten durch eine Art persönliches DRM unter Kontrolle halten können und so selbstbestimmt über seine Daten bestimmen können. Die Idee mag sich zwar gut anhören, ist aber aus meiner Sicht unrealistisch. Egal welches technische System hierzu entwickelt wird, 100% sicher wird es nie sein können. Systeme werden gehackt, Verschlüsselungsmethoden geknackt oder mit der Zeit schwach. Aus meiner Sicht ist die Datensparsamkeit der bessere Ansatz.

Tag 2:

Ab Tag zwei wurde das klassische Konferenzformat über den Haufen geworfen und ein BarCamp gestartet. Es wurden auf der Unkonferenz sehr viele Sessions eingereicht, gar nicht so leicht sich zu entscheiden….

Keep your ideas – Sammeln, schweigen, umsetzen!

Sebastian Moss startete das Thema Ideen. Wie geht man mit Ideen um? Auf nem Zettel aufschreiben, vergessen (die guten bleiben eh in Erinnerung), digital festhalten, oder, oder, oder. Nach anregender Diskussion stand der Vorschlag: Ideen aufschreiben und immer wieder mal drüber schauen, evtl. hilft eine alte Idee bei einem aktuellen Problem.

Tools, Methoden und Erfahrungen in der Arbeit mit verteilten Teams

Hier ging es um die Erkenntnis, dass die Arbeit in verteilten Teams bereits jetzt Realität ist. Wir haben diskutiert wie das in der Praxis mit weltweit verteilten Teams bereits jetzt schon funktioniert.

Tag 3:

Innovation im eigenen Projektgeschäft

In der Session wurde das Thema gleich etwas verallgemeinert und die Diskussion rankte sich um Methoden um Innovation in Teams zu bekommen.

Lego Serious Play

Ein Erfahrungsbericht über den Einsatz von Lego Serious Play bei der Piratenpartei.

Fazit

Alles in allem kann ich die Veranstaltung nur empfehlen. Super Kontakte und Sessions. Ich freue mich auf nächstes Jahr.

post

Multienvironment Puppet

Im Puppet-Umfeld passiert immer noch relativ viel. Standards ändern sich und werden mit deprecated markiert. Daher hier eine Zusammenfassung für eine aktuelle Puppet-Umgebung.

Verzeichnisstruktur

Wer mit verschiedenen Umgebungen (production/testing) arbeitet und keinen external node classifier verwendet und node Definitionen lieber in klassisch in „node.pp“ Files ablegt, braucht eine Verzeichnisstruktur für die Unterscheidung der Umgebungen. Best Practice aktuell (Puppet v3.7.4) ist in der /etc/puppet/puppet.conf:

Die entsprechende Verzeichnisstruktur für die Ablage der Nodedefinitionen  sieht dann so aus:

 Hiera

Wer dem Design Pattern „Separation Of Data And Code“ folgt (und ich kann nur empfehlen es zu tun) fragt sich früher oder später wie er die ganzen Default Werte und Übergabeparameter an Puppet Klassen aus dem Code oder aus den Nodedefinitionen wieder herausbekommt. Im ersten Schritt wird man eine params.pp (Siehe https://docs.puppetlabs.com/guides/module_guides/bgtm.html) bauen und da zumindest die ganzen Defaultwerte einbauen. Aber so richtig los wird man das Ganze mit Hiera.
Hier werden alle Daten, ob Defaultwerte oder speziellere Daten, die z.B. pro Umgebung/Betriebssystem/Rechner/… unterschiedlich sind, in YAML Files abgelegt. Wie der Name „Hiera“ schon sagt ist der Clou an der Sache das hierarchische Element. So kann man Werte mehrfach definieren. Hiera geht dann, ähnlich wie bei Firewallregeln, von oben nach unten durch und nimmt den ersten Treffer. Die Konfiguration ist trivial:

Auf der Suche nach dem Wert einer Variable sucht Hiera in /etc/puppet/hieradata nach Files die auf den Rechnernamen, die Umgebung oder „common“ matchen und liest den Wert aus der ersten passenden Datei, welche die entsprechende Variable enthält. Im Puppet Code kann man Hiera auf zwei Arten nutzen.

1. Nutzung der Funktion hiera()

 2. Implizit über Übergabeparameter

Das ist mein Favorit. Ggf. benötigte Parameter werden als Übergabeparameter in der Puppetklasse definiert:

Diese werden dann automatisch ohne Angabe in der Nodedefinition in Hiera gesucht und genutzt, wenn vorhanden.

Beispiel

  • Rechnername: web01.domain.tld
  • Umgebung: production

Folgende Hieradateien sind abgelegt (hiera.yaml wie oben angegeben):

Somit wird eine Variable „$pwd“ der Klasse „web„, bzw. „hiera(‚web::pwd‘)“ zuerst in der „web01.domain.tld.yaml„, dann in der „production.yaml“ und falls sie noch nicht gefunden wurde in der „common.yaml“ gesucht. Die YAML Datei könnte wie folgt aussehen:

Vorteil ist, dass nun sehr einfach in jeder Umgebung ein anderes Passwort gesetzt sein könnte und das passende einfach so ohne irgendwelche If-Abfragen im Puppet genutzt wird.

post

Ruby on Rails | Massenverarbeitung mit ActiveRecord

Bei der produktiven Nutzung eines von mir entwickelten Tools hat es zugeschlagen: Es ist halt doch etwas anderes mit ein paar Testdatensätzen oder mit ein paar Hunderttausend Datensätzen zu arbeiten. Die Laufzeiten für INSERTs und UPDATEs gingen gar nicht. Also was tun? Das Projekt ist mit ActiveRecord realisiert.

Etwas Recherche hat gezeigt: Da geht einiges!

Abrufen von Datensätzen

Das Abrufen von Datensätzen via ActiveRecord kann über verschiedene Techniken beschleunigt werden. Erster Ansatzpunkt sind die Funktionen zum Abruf von Datensätzen in Bündeln (Batches). Hierzu bietet ActiveRecord bereits Funktionen an, so dass eine große Menge an Datensätzen nicht auf einmal, sondern stapelweise und somit schonend für Arbeitsspeicher und Swap Bereich verarbeitet werden kann (Retrieving Multiple Objects in Batches).

Generell sollte man die Menge an Datensätzen aus der Datenbank bereits bei der Abfrage weitestgehend reduzieren um im Programmcode möglichst nur noch mit den relevanten Datensätzen zu arbeiten. Es sollten also nicht die Ruby Methoden find bzw. find_all zum Filtern von Datensätzen genutzt werden, sondern besser bereits bei der Abfrage entsprechende Einschränkungen gemacht werden.

Also so eher nicht:

Besser:

Bei n:m Beziehungen sollte man mit der ‚through‘ Anweisung arbeiten um die Beziehungen zwischen Objekten darzustellen (Siehe http://guides.rubyonrails.org/association_basics.html#the-has-many-through-association). ActiveRecord generiert dann SQL mit entsprechenden JOIN Anweisungen, anstatt über mehrere SELECTs die Anfragen zusammenzubauen.

UPDATEs auf vielen Datensätzen

Updates auf vielen Datensätzen ist ineffizient, wenn für jeden Datensatz ein eigenes UPDATE Statement generiert wird. Hier schafft update_all Abhilfe. Man selektiert vorab alle Datensätze die aktualisiert werden sollen und kann dann diese in einem Rutsch bearbeiten:

Somit wird ein UPDATE Statement für alle Datensätze erzeugt.

Massen-INSERT

Das massenhafte Anlegen neuer Datensätze frisst ebenso sehr viel Performance, da für jeden INSERT eine eigene Transaktion gestartet wird. Hier kann man manuell eingreifen und ActiveRecord beibringen alle INSERTs ein einer Transaktion zu verarbeiten:

post

Jenkins SVN Plugin mag kein htaccess

Das aktuelle Jenkins SVN Plugin in der Version 2.5 (https://wiki.jenkins-ci.org/display/JENKINS/Subversion+Plugin) ist leider etwas buggy. Unser SVN läuft unter Linux/Apache mit Kerberos Authentifizierung, so dass man sich normalerweise ganz einfach via Basic Authentifizierung anmelden kann. Mit älteren Jenkins SVN Plugin Versionen ist das auch keine Problem. Allerdings scheint die aktuelle Version hier fehlerhaft zu arbeiten. Jenkins versucht gar nicht erst die Credentials via Basic Authentifizierung weiterzugeben, sondern scheint nur noch NTLM zu versuchen. Im Apache Log kommt nicht einmal ein Username an.

Was hilft: Eine ältere Version (z.B. 1.54) verwenden. Zumindest scheint schon ein Bug offen zu sein:

https://issues.jenkins-ci.org/browse/JENKINS-27084

Performanceprobleme bei virtualisierter Astaro Firewall

Beim Einsatz der Astaro Security Gateway Virtual Appliance für VMware auf einem VMWare ESXi 5 Hypervisor sind eklatante Performanceprobleme aufgetreten. Die Latenz z.B. beim Aufruf von Webseiten war sehr hoch und alles gefühlt „langsam“. Laut Internet scheint das Problem primär bei der Kommunikation zu virtuellen Maschinen, die auf dem selben ESXi Host laufen, zu aufzutreten. Die Umstellung des Netzwerkkartentyps von „flexibel“ auf „e1000“ in VMWare behebt das Problem.

xVM finally dead :-(

Leider scheint die Solaris Portierung von Xen nun endgültig rausgeflogen zu sein. Nach einem Upgrade von Solaris 11 Express auf Solaris 11 gibt es leider weder einen xend noch das Hypervisorfile xen.gz. Um das offizielle Statement hierzu zu finden musste man etwas suchen. Aus http://www.oracle.com/technetwork/systems/end-of-notices/eonsolaris11-392732.html:

xVM Hypervisor
xVM hypervisor, the Oracle Solaris Xen-based hypervisor for x86 systems, has been removed. Oracle offers two x86-based hypervisor solutions for Oracle Solaris users: Oracle VM Server for x86 and Oracle VM VirtualBox. See http://www.oracle.com/virtualization

Schade 🙁

Change default browser on lion per script

Ich verwende einen Browser @work und einen anderen @home. Mittels locationchanger (http://tech.inhelsinki.nl/locationchanger/) möchte ich diesen umschalten, was unter OS X nicht ohne weiteres möglich ist. Ein Wechsel von Firefox auf Safari ginge zwar z.B. so:

defaults write com.apple.LaunchServices LSHandlers "defaults read com.apple.LaunchServices LSHandlers | sed -e 's/org.mozilla.firefox/com.apple.safari/'"

Leider muss jedoch anschließend dem System mitgeteilt werden, dass sich hier etwas geändert hat. Hierzu habe ich nichts sinnvolles gefunden. Allerdings gibt es duti (http://duti.sourceforge.net/). Damit ist es ganz einfach:

Safari:

/usr/local/bin/duti -s com.apple.safari http
/usr/local/bin/duti -s com.apple.safari https

Firefox:

/usr/local/bin/duti -s org.mozilla.firefox https
/usr/local/bin/duti -s org.mozilla.firefox http