Wenn man für Puppet Code oder Module entwickeln möchte gibt es verschiedene Ansätze die man nutzen kann:
- locale Entwicklung, git pushen, in Entwicklungs-Environment auf produktivem Puppetmaster testen
- lokale Entwicklung, VM mit Puppet Agent, puppet apply nutzen
- lokale Entwicklung, VMs Puppetmaster/Puppetserver mit Puppetdb Anbindung und einer oder mehrere Clients mit Puppet Agent
Wir wollen uns hier die dritte Möglichkeit anschauen. Als Basis nutzen wir Vagrant, eine Automatisierungsplattform für reproduzierbare Entwicklungsumgebungen.Die Virtualisierung übernimmt in dem Fall Virtual Box.Vagrant nutzt zum Provisionieren der VMs zwei verschiedene Teile:
- sogenannte Base Boxes, ein Basisimage, auf dem alles weitere aufsetzt
- Das sogenannte Vagrantfile das diese Box kopiert, startet und in den gewünschten Zustand überführt.
Das schöne ist Vagrantfiles und Base Boxes (sofern sie selbstgebaut sind) lassen sich wunderbar unter Versionskontrolle stellen und mit mehreren Leuten weiterentwickeln. Und das Ergebnis sieht am Ende bei jedem gleich aus, ohne das man sich ein Bein dafür ausreissen muss.
Wie sieht jetzt eine fertige Entwicklungs Umgebung aus mehreren VMs aus?
- puppet (Puppetmaster/Puppetserver)
- puppetdb (PuppetDB API Teil)
- postgres-puppetdb (PuppetDB Datenbank Backend)
- puppetclient01 (Puppet Agent, für diesen Node wird Entwickelt)
Um nun die Entwicklungsumgebung aufzubauen checkt man folgendes Git aus und installiert Virtual Box und Vagrant. Jetzt wechselt ins Repository und führt das Script yes_create_a_puppet_development_environment.sh aus. Nun entscheidet man sich für eine Puppetversion, wir nehmen Version 4. Nach ca. 20 Minuten hat man eine laufende Entwicklungsumgebung. Man hat jetzt die Wahl ob man aus dem Vagrant Ordner entwickelt oder die Grundlage in ein neues Git überführt und dieses seperat mountet. Eine Anleitung dazu findet sich in der Readme, genau wie geplante Features und Bugs
Das Git Repository für die Base Boxen findet sich Hier und die Boxen können mit Packer zu Images gebaut werden.
Danke, guter Artikel!
Wir nutzen hier etwas ähnliches: Wir erstellen pro Server-Rolle ein Git-Repository mit einem Vagrant und Puppetfile. In das Puppetfile tragen wir alle benötigten Module ein – resp. nur unsere eigenen, welche alle anderen Module im metadata.json als Dependency eingetragen haben. Librarian-Puppet holt sich dann die Module inkl. Dependencies in das Directory modules/ (geschieht lokal).
Anschliessend applyen wir das Manifest site.pp mit Inhalt `hiera_include(‚profiles‘, [])` direkt in einer mit Vagrant erstellten VM:
„`
puppet apply –hiera_config /vagrant/hiera.yaml –modulepath=/vagrant/modules /vagrant/manifests/site.pp
„`
Die Herarchy im hiera.yaml ist sehr einfach: nodes/%{::hostname}, role.
Das Vagrantfile enthält eine oder mehrere VMs, welche mit einem einfachen Shell-Provisioning angepasst werden. D.h. der puppet-agent wird aktualisiert und `puppet apply` wird ausgeführt.