Der Vortrag beschreibt Möglichkeiten zur sinnvollen Trennung von Daten und Module mit Puppet 3. Insbesondere in heterogenen Systemlandschaften und über Umgebungsgrenzen hinweg gilt es, die Freiheiten, die Puppet zur Verfügung stellt, richtig einzusetzen.
Es wird die Verwendung von Variablen im Top Scope, parametrisierten Klassen und Hiera beschrieben, mit Hilfe derer dies erreicht werden kann. Der Umgang mit Default-Werten bzw. Parametern wird anhand der params.pp oder Hashes in Templates beschrieben und an Code-Beispielen verdeutlich. Im letzten Schritt wird auf notwendige Tests und den Umgang mit Modulabhängigkeiten eingegangen, die durch diese Aufteilung notwendig werden und zur Wartbarkeit des Codes beitragen.
3. 3
Aufgabe
‣ Repositories und Module für heterogene Systemlandschaften verwalten
Ziele
‣ Wartbarkeit erhöhen
‣ Transparenz schaffen
‣ Prozess erzwingen
Weg
‣ Umgebungen, Modellierung von Daten und Abhängigkeiten
Einleitung
... worum es in diesem Vortrag geht
4. 4
Konfigurationsverwaltung
‣ So einfach und minimal wie möglich
‣ Daten und Code trennen
‣ Konfigurationen beim Anwenden testen
‣ Konfigurationsverwaltung erzwingen
‣ Alles unter Versionskontrolle stellen
‣ Konfiguration in ein VCS
‣ Daten in ein Repository (Paketmanager oder Artefakt Repository)
‣ Versionierung überwachen
Einleitung
... worum geht es bei der Konfigurationsverwaltung?
5. 5
Umgebungsverwaltung
‣ Redundanzen vermeiden
‣ Auseinanderlaufen verhindern
Klärungen
‣ Paketabhängigkeiten in Puppet oder Paketmanagement
‣ Baremetal, Betriebsystem, Dienste, Applikationen
Einleitung
... worum geht es bei der Umgebungsverwaltung?
7. 7
Ziel
‣ Umgebungen abbilden (Test, Abnahme, Produktion)
‣ Nach Möglichkeit gleiche Codebasis
‣ Versionsstände abbilden (Feature, Release, Hotfix, Master)
‣ So wenig branchen wie möglich (Continous Integration)
‣ Workflow (Gleiche vs. getrennte Codebasis)
Environments
... die Verwaltung von Umgebungen mit Puppet
8. 8
Erklärung Environment
‣ Environment Konfiguration (puppet.conf)
‣ manifest ($manifestdir/site.pp)
‣ modulepath ($confdir/modules)
‣ manifestdir ($confdir/manifests)
‣ templatedir ($vardir/templates)
‣ Zugriff in Modulen über $environment
Environments
... die Verwaltung von Umgebungen mit Puppet
9. 9
Konfiguration auf dem Master (puppet.conf)
‣ Möglichkeit einfach neuen Code zu testen
[master]
environment = production
manifest = $confdir/environments/$environment/manifests/site.pp
modulepath = $confdir/environments/$environment/modules
[agent]
environment = production
Dynamic Environments
... Weiterentwicklung mit temporären Umgebungen
10. 10
Anwendung auf dem Node
‣ puppet agent --environment <name>
‣ puppet agent --environment <name> --noop
Dynamic Environments
... Weiterentwicklung mit temporären Umgebungen
11. 11
Anwendung zentral über Puppet
Dynamic Environments
... Weiterentwicklung mit temporären Umgebungen
12. 12
Environments & VCS Best Practices
‣ Alles Versionieren
‣ Style und Syntax Check mit Puppet Lint (pre-commit)
‣ Monitoring für alles was im Puppet verwaltet wird
Environments
... die Verwaltung von Umgebungen mit Puppet
14. 14
Trennung von Daten und Code – Möglichkeiten
1. Top Scope Variable
2. Node Inheritance
3. Parametrisierte Klassen
4. Extlookup
5. Hiera
Trennung von Daten und Code
... die Möglichkeiten
15. 15
Variable im Top Scope
‣ Variable werden im zentralen Manifest definiert und in den Modulen verwendet
Variable im Top Scope – Beispiel
Trennung von Daten und Code
... mittels Variablen
16. 16
Variable im Top Scope – Vor- und Nachteile
‣ Pro: Sehr einfach
‣ Pro: defacto Trennung von Code und Daten
‣ Con: immer noch im gleichen Repository
‣ Con: unklar wo die Variablen verwendet werden und welcher Werte gesetzt ist
Trennung von Daten und Code
... mittels Variablen
17. 17
Node Inheritance
‣ Variable werden in Nodes definiert und über Vererbung die Hierarchie abgebildet
Node Inheritance – Beispiel
Trennung von Daten und Code
... mittels Node Inheritance
18. 18
Node Inheritance – Vor- und Nachteile
‣ Pro: Sehr einfach
‣ Pro: defacto Trennung der Daten vom Code
‣ Con: immer noch im gleichen Repository
‣ Con: unklar wo die Variablen verwendet werden und welcher Werte gesetzt ist
Trennung von Daten und Code
... mittels Node Inheritance
19. 19
Parametrisierte Klassen
‣ Variable werden in Nodes definiert und über Vererbung die Hierarchie abgebildet
Parametrisierte Klassen – Beispiel
Trennung von Daten und Code
... mittels parametrisierte Klassen
20. 20
Parametrisierte Klassen – Vor- und Nachteile
‣ Pro: Daten nicht mehr im Modulcode und Defaultwerte möglich (Lesbarkeit)
‣ Pro: klar wo die Variablen verwendet werden
‣ Con: Daten und Logik in params.pp ausgelagert
Trennung von Daten und Code
... mittels parametrisierte Klassen
21. 21
Extlookup
‣ Hierarchischer Lookup einer Variable im datadir basierend auf Fact und Key
Extlookup – Beispiel
Trennung von Daten und Code
... mittels extlookup
22. 22
Extlookup – Vor- und Nachteile
‣ Pro: dynamische und hierarchische Abbildung von Werten
‣ Con: schlechte Wartbarkeit (CSV)
‣ Con: liefert nur den ersten Wert, keine zusammengesetzten Werte
Trennung von Daten und Code
... mittels extlookup
23. 23
Hiera
‣ Hierarchischer Lookup einer Variable im datadir ähnlich wie extlookup
Hiera – Konfiguration
Trennung von Daten und Code
... mittels Hiera
24. 24
Hiera Beispiele
‣ hiera – spezifischen Wert anhand des Schlüssels zurückliefern
$local_var = hiera('my_name')
‣ hiera_array – alle Strings als Array zurückliefern
$local_array = hiera_array('my_array')
‣ hiera_hash – alle Werte zu einem Hash zusammenfassen und zurückliefern
$local_hash = hiera_hash('my_hash‘)
Trennung von Daten und Code
... mittels Hiera
25. 25
Hiera auf der Kommandozeile
‣ Die YAML Datenbank abfragen
hiera <key> [Optionen]
‣ Wichtige Optionen
‣ --yaml <file>
‣ --array
‣ --hash
Trennung von Daten und Code
... mittels Hiera
26. 26
Hiera und Node Definitions
‣ Liste von Klassen aus Hiera abfragen und anwenden
Trennung von Daten und Code
... mittels Hiera
27. 27
Hiera – Vor- und Nachteile
‣ Pro: dynamische und hierarchische Abbildung von Werten
‣ Pro: Default Werte möglich
‣ Pro: Trennung von Code und Daten
‣ Pro: zusammengesetzten Werte
Trennung von Daten und Code
... mittels Hiera
28. 28
Hiera Best Practices
‣ Hiera nicht in Templates sondern nur im Manifest verwenden (Lesbarkeit)
‣ Hierarchien minimal halten (Einfachheit)
‣ Hiera Daten pro Umgebung trennen
:datadir: '/etc/puppet/environments/%{environment}/hieradata'
Trennung von Daten und Code
... mittels Hiera
29. 29
Empfehlung
‣ So nah wie möglich am Code (Lesbarkeit)
‣ Seit weit entfernt wie nötig (Abstrahierbarkeit)
‣ Im Zweifel Hiera
‣ Default-Werte verwenden
Trennung von Daten und Code
... die Zusammenfassung
31. 31
Grund
‣ Reihenfolge im Manifest wird nicht beachtet (deklarativ)
‣ Abhängigkeiten zwischen Ressourcen müssen modelliert werden
Problem
‣ Reihenfolgen oft doch relevant
‣ z.B. Dienst installieren, konfigurieren und starten
Reihenfolgen und Abhängigkeiten
... die Problemstellung
32. 32
Reihenfolgen und Abhängigkeiten
1. Metaparameter
2. Chaining
3. Die „require“ Funktion
4. Run Stages
Reihenfolgen und Abhängigkeiten
... die Möglichkeiten
33. 33
Metaparameter
‣ Einsatzzweck: Abhängigkeiten zwischen Ressourcen
‣ Before (Ressource vor einer anderen anwenden)
‣ Require (Ressource nach einer anderen anwenden)
‣ Notify (Ressource vor einer anderen anwenden und Änderungen mitteilen)
‣ Subscribe (Ressource nach einer anderen anwenden und Änderungen mitteilen)
Reihenfolgen und Abhängigkeiten
... die Verwendung von Metaparametern
35. 35
Metaparameter – Vor- und Nachteile
Pro: funktionieren mit jedem Ressourcen Typ
Con: wird schnell unübersichtlich
Reihenfolgen und Abhängigkeiten
... die Verwendung von Metaparametern
36. 36
Chaining
‣ Einsatzzweck: Abhängigkeiten zwischen Ressourcen(-gruppen)
‣ -> (ordering arrow)
Die Ressource links des Pfeils wird zuerst angewendet
‣ ~> (notification arrow)
Die Ressource links des Pfeils wird zuerst angewendet und bei Änderungen wird
die Rechte benachrichtigt
‣ Best Practice: Pfeile nur in eine Richtung (rechts) verwenden
Reihenfolgen und Abhängigkeiten
... Chaining
41. 41
‣ Chaining – Vor und Nachteile
‣ Pro: Funktioniert für Ressourcen und Gruppen von Ressourcen
‣ Pro: sehr flexibel vor allem im Zusammenspiel mit virtuellen Ressourcen
‣ Con: Gefahr von Dependency Cycles insbesondere mit virtuellen Ressourcen
puppet agent --configprint graphdir
Reihenfolgen und Abhängigkeiten
... Chaining
42. 42
Funktion „require“
‣ Einsatzzweck: Abhängigkeiten zwischen Klassen abbilden
‣ require (Klassen vor einer Ressource anwenden)
‣ Wird auch bei mehrfachen Aufrufen nur einmal ausgeführt im Gegensatz zu include
Funktion „require“ – Beispiel
Reihenfolgen und Abhängigkeiten
... die „require“ Funktion
43. 43
Run Stages
‣ Einsatzzweck: Gruppe von Klassen die vor oder nach allem anderen laufen soll
‣ Definition über einen Ressource Type, Verwendung durch Zuweisung eines
Metaparameters in einer Klasse
Run Stages – Beispiel
Reihenfolgen und Abhängigkeiten
... run stages für Massenabhängigkeiten
44. 44
Run Stages – Vor- und Nachteile
‣ Pro: Massenabhängigkeiten abbildbar
‣ Con: funktioniert nicht mit include, subscribe oder notify
‣ Con: Klassen die andere Klassen deklarieren verhalten sich im run stage anders
‣ Empfehlung: einzig valider Fall sind Abhängigkeiten mit Paketrepositories
Reihenfolgen und Abhängigkeiten
... run stages für Massenabhängigkeiten
45. 45
Zusammenfassung
‣ Abhängigkeiten innerhalb von Klassen mit Metaparametern und Chaining
‣ Abhängigkeiten zwischen Klassen mit der require Funktion
‣ Run Stages vermeiden
‣ So einfach wie möglich halten um Dependency Cycles zu vermeiden
Reihenfolgen und Abhängigkeiten
... die Zusammenfassung
46. 46
Vielen Dank für Ihre Aufmerksamkeit
Kontakt
Alexander Pacnik
Systems Engineering
inovex GmbH
Office Karlsruhe
Zur Gießerei 16
76227 Karlsruhe
+49 (0)173 3181 040
alexander.pacnik@inovex.de