Puppet - Umgebungen, Daten & Code, Abhängigkeiten

Preview:

DESCRIPTION

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.

Citation preview

Linux Tag 2013 - Puppet

Umgebungen, Daten & Code, Abhängigkeiten

Alexander Pacnik Karlsruhe, 23.05.2013

Umgebungen

2

Die Agenda ... worum es in diesem Vortrag geht

Abhängig- keiten

Trennung von Daten und Code

Modul Best

Practices

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

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

Umgebungsverwaltung

‣  Redundanzen vermeiden

‣  Auseinanderlaufen verhindern

Klärungen

‣  Paketabhängigkeiten in Puppet oder Paketmanagement

‣  Baremetal, Betriebsystem, Dienste, Applikationen

Einleitung ... worum geht es bei der Umgebungsverwaltung?

Umgebungen

6

Reihenfolgen und Abhängigkeiten ... Abhängigkeiten modellieren

Abhängig- keiten

Trennung von Daten und Code

Modul Best

Practices

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

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

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

Anwendung auf dem Node ‣  puppet agent --environment <name>

‣  puppet agent --environment <name> --noop

Dynamic Environments ... Weiterentwicklung mit temporären Umgebungen

11

Anwendung zentral über Puppet

Dynamic Environments ... Weiterentwicklung mit temporären Umgebungen

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

Umgebungen

13

Reihenfolgen und Abhängigkeiten ... Abhängigkeiten modellieren

Abhängig- keiten

Trennung von Daten und Code

Modul Best

Practices

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

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

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

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

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

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

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

Extlookup ‣  Hierarchischer Lookup einer Variable im datadir basierend auf Fact und Key

Extlookup – Beispiel

Trennung von Daten und Code ... mittels extlookup

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

Hiera ‣  Hierarchischer Lookup einer Variable im datadir ähnlich wie extlookup

Hiera – Konfiguration

Trennung von Daten und Code ... mittels Hiera

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

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

Hiera und Node Definitions ‣  Liste von Klassen aus Hiera abfragen und anwenden

Trennung von Daten und Code ... mittels Hiera

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

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

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

Umgebungen

30

Reihenfolgen und Abhängigkeiten ... Abhängigkeiten modellieren

Abhängig- keiten

Trennung von Daten und Code

Modul Best

Practices

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

Reihenfolgen und Abhängigkeiten 1.  Metaparameter

2.  Chaining

3.  Die „require“ Funktion

4.  Run Stages

Reihenfolgen und Abhängigkeiten ... die Möglichkeiten

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

34

Metaparameter – Beispiel

Reihenfolgen und Abhängigkeiten ... die Verwendung von Metaparametern

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

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

37

Chaining – Anwendungsfälle ‣  Ressourcen Deklarationen

‣  Puppet Code Blöcke

Reihenfolgen und Abhängigkeiten ... Chaining

38

Chaining – Anwendungsfälle ‣  Ressourcen Referenzen

‣  Referenz auf eine existierende Puppet Ressource (Typ und Titel)

Reihenfolgen und Abhängigkeiten ... Chaining

39

Resource Collectors ‣  Ressourcen gruppieren anhand bestimmter Attribute

‣  Syntax: <| [Ausdruck] |>

‣  Suchausdrücke mit „!=“, „==“, „and“ und „or“

Exkurs ... Resource Collectors

40

Chaining – Anwendungsfälle ‣  Ressourcen Collectoren (auch virtuelle Ressourcen)

Reihenfolgen und Abhängigkeiten ... Chaining

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

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

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

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

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

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

Anhang

48

Quellen ‣  Puppet Style Guide

http://docs.puppetlabs.com/guides/style_guide.html

‣  Puppet Language Guide

http://docs.puppetlabs.com/guides/language_guide.html

‣  Puppet Referenzen

http://docs.puppetlabs.com/references/latest/

‣  Puppet Guides

http://docs.puppetlabs.com/guides/

‣  Puppet Blog

https://puppetlabs.com/blog/

Lizenz des Vortrags ‣  Creative Commons (by-nc-nd)

Anhang ... wo sie in Ruhe nachlesen können

Recommended