Dank travees wurden die puppet-lint-security-plugins aktualisiert und sind nun zu puppet-lint 2.x kompatibel.

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.
Nun noch ein paar Hintergrundinfos.

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
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.

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:
[main] environmentpath = $confdir/environments environment = testing
Die entsprechende Verzeichnisstruktur für die Ablage der Nodedefinitionen sieht dann so aus:
/etc/puppet/environments/ ├── example_env │ ├── manifests │ └── modules ├── testing │ └── manifests │ └── site.pp └── production └── manifests └── site.pp
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:
--- :backends: yaml :yaml: :datadir: /etc/puppet/hieradata :hierarchy: - "%{::clientcert}" - "%{::environment}" - common
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()
$pwd=hiera('db::pwd')
2. Implizit über Übergabeparameter
Das ist mein Favorit. Ggf. benötigte Parameter werden als Übergabeparameter in der Puppetklasse definiert:
class web ($pwd) { # Benutze $pwd.... }
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):
/etc/puppet/hieradata/ ├── common.yaml ├── testing.yaml ├── production.yaml └── web01.domain.tld.yaml
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:
--- web::db: IchBinGanzGeheim!
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.

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:
class Client < ActiveRecord::Base has_one :address has_many :orders has_and_belongs_to_many :roles end top_clients=Client.all.find_all do |client| client.orders.count > 5 end
Besser:
class Client < ActiveRecord::Base has_one :address has_many :orders has_and_belongs_to_many :roles end top_clients=Client.where("orders_count > 5")
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:
# Alle Clients mit mehr als 5 Bestellungen sind VIPs Client.where("orders_count > 5").update_all(vip: true)
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:
ActiveRecord::Base.transaction do 1000.times do Client.create(options) end end

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:
Reboot auf mein-blog.com
Lang ist nichts passiert, aber nun geht es wieder los!
Reboot von floek.net auf der neuen Blog Plattform mein-blog.com. Neues Design, neue Beiträge.
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 🙁