Quantcast
Channel: Go DevOps!
Viewing all articles
Browse latest Browse all 19

Puppet baut dein Wunschhaus

$
0
0

Ich bin jetzt seit vier Monaten bei Puppet Labs Inc. als Mitarbeiter beschäftigt. Einer meiner Aufgaben bei Puppet Labs ist es die Puppet Technologie Kunden und neuen Partner nahe zu bringen sowie vom Mehrwert durch Nutzung von Puppet innerhalb existierender IT-Landschaften zu überzeugen.

Die Frage welche ich mir jedes Mal selbst dabei stelle ist: “Wie kann man den Mehrwert von Puppet so einfach beschreiben damit Ihn jeder versteht?”.

Eine Idee die mir dabei nicht mehr aus dem Kopf gegangen ist wäre es Puppet auf eine sehr abstrakte Weise zu beschreiben. Getreu dem folgenden Zitat von Albert Einstein: “Wenn man etwas nicht einfach erklären kann, hat man es nicht verstanden.” versuche ich nun an dem abstrakten Beispiel “Puppet baut dein Wunschhaus” den Mehrwert von Puppet verständlich für jeden zu beschreiben.

Nehmen wir mal an, ich möchte mein Wunschhaus bauen. Ein Haus ist, analog zu einer IT-Landschaft, ein komplexes Konstrukt. Da ich weder Architektur studiert noch irgendein Handwerk gelernt habe wird es für mich schwer bis nahezu unmöglich mein Wunschhaus selbst zu realisieren. Was ich aber tun kann, und ich gehe davon aus jeder kann dies, ist es mein Wunschhaus zu beschreiben. Dazu kann ich mein Wunschhaus in beliebig viele Einzelteile zerlegen und den gewünschten Zustand dieser Teile einzeln beschreiben. Um mein Wunschhaus einfach zu gestalten zerlegen wir es in folgende Bauteile:

– Ein Dach
– 4 Wände (vorne, hinten, links und rechts)
– 3 Fenster (links, rechts und hinten)
– 1 Tür
– Fundament

Jedes dieser Bauteile kann ich beliebig detailliert weiter beschreiben. z.B: mein Dach soll rote Ziegel haben, Glassfaserdämmung und das Dachkonstrukt aus Leimholz bestehen. Meine Tür soll die Farbe anthrazit, ein Zahlenschloss als Schloss haben sowie einen Briefkastenschlitz usw.

In Puppet Sprache wäre jedes einzelne Bauteil eine sogenannte Puppet Ressource. Jede dieser Ressourcen hat dann 1 bis n beliebige Attribute. Die Puppet Sprache hat immer den gleichen Aufbau: Ressource, Name der Ressource und 1 bis n Attribute mit ihrem jeweiligen Werten. Dies stellt sich wie folgt dar:

Ressource { 'Name der Ressource':
  Attribut 1 => Wert 1,
  Attribut 2 => Wert 2,
  Attribut n => Wert n,
}

Da die Puppet Sprache damit für jeden einfach lesbar ist würde ich die einzelnen Bauteile meines Hauses wie folgt beschreiben:

Dach { 'mein Dach': 
 Dachziegel => 'rot', 
 Dämmung => 'Glassfaser', 
 Konstrukt => 'Leimholz', 
}

Tür { 'Meine Eingangstür':
 Schloss => 'Zahlenschloss',
 Farbe => 'Anthrazit',
 Briefkastenschlitz => 'ja'
}

usw.

Wunderbar! Jetzt habe ich alle meine einzelnen Bauteile beschrieben. Als nächstes muss ich jedoch diese Bauteile in Verbindung zueinander bringen, da ja z.B. eine Tür alleine mir nicht viel bringt, und ich dafür zunächst z.B. eine Wand benötige, damit meine Tür nicht umfällt. Hier kommen die sogenannten Beziehungsparameter zum Einsatz, welche mir dabei helfen die Abhängigkeiten der Ressourcen untereinander zu beschreiben. Als Beispiel wäre die Abhängigkeit eine Tür von einer Wand wie folgt beschrieben:

Wand { 'Vorne':
 Innenfarbe => 'blau',
 Außenfarbe => 'gelb',
 Höhe => '3 Meter',
 Breite => '4 Meter',
}

Tür { 'Meine Eingangstür':
 Schloss => 'Zahlenschloss',
 Farbe => 'Anthrazit',
 Briefkastenschlitz => 'ja'
 Benötigt => Wand ['Vorne'],
}

Durch den Beziehungsparemeter  Benötigt => Wand [‘Vorne’] habe ich die Abhängigkeit beschrieben meine Eingangstüre erst dann zu erstellen und einzubauen wenn die Wand mit dem Name Vorne gebaut wurde. Das macht Sinn, oder?

O.k. um nun einen kompletten Bauplan meines Wunschhauses zu erstellen muss ich natürlich alle einzelnen Bausteine (Ressourcen) in Verbindung setzen. Mein kompletter Bauplan würde dann wie folgt aussehen:

Fundament { 'Mein Fundament':
 Material => 'Beton',
 Länge  => '4 Meter',
 Breite => '4 Meter',
}

Wand { 'Vorne':
 Innenfarbe => 'blau',
 Außenfarbe => 'gelb',
 Höhe => '3 Meter',
 Breite => '4 Meter',
 Benötigt => Fundament ['Mein Fundament'],
}

Wand { 'Hinten':
 Innenfarbe => 'blau',
 Außenfarbe => 'gelb',
 Höhe => '3 Meter',
 Breite => '4 Meter',
 Benötigt => Fundament ['Mein Fundament'],
}

Wand { 'Links':
 Innenfarbe => 'blau',
 Außenfarbe => 'gelb',
 Höhe => '3 Meter',
 Breite => '4 Meter',
 Benötigt => Fundament ['Mein Fundament'],
}

Wand { 'Rechts':
 Innenfarbe => 'blau',
 Außenfarbe => 'gelb',
 Höhe => '3 Meter',
 Breite => '4 Meter',
 Benötigt => Fundament ['Mein Fundament'],
}

Fenster { 'Links':
 Rahmenfarbe => 'lila':
 Höhe => '1 Meter',
 Breite => '1 Meter',
 Benötigt => Wand ['Links'],
}

Fenster { 'Rechts':
 Rahmenfarbe => 'gelb':
 Höhe => '1 Meter',
 Breite => '1 Meter',
 Benötigt => Wand ['Rechts'],
}

Fenster { 'Hinten':
 Rahmenfarbe => 'gelb':
 Höhe => '1 Meter',
 Breite => '1 Meter',
 Benötigt => Wand ['Rechts'],
}

Dach { 'mein Dach': 
 Dachziegel => 'rot', 
 Dämmung => 'Glassfaser', 
 Konstrukt => 'Leimholz', 
 Benötigt => Wand ['Vorne', 'Hinten, 'Links', 'Rechts']
}

Geschafft! Jetzt habe ich einen kompletten Bauplan für mein Wunschhaus in Puppet Sprache beschrieben und zeitgleich die Abhängigkeiten der einzelnen Ressourcen untereinander klar gemacht.

Und jetzt kommt der große Mehrwert von Puppet! In Puppet beschreibe ich lediglich den Bauplan meines Wunschhauses und Puppet übernimmt als Bauleiter alle notwendigen Schritte um mein Wunschhaus zu erstellen. Dafür verwendet Puppet sogenannte Handwerker, welche in Puppet Sprache sogenannte Provider wären. Für mein Haus grob dargestellt benötige ich folgende Provider :

– Dachdecker

– Fenster & Tür Monteur

– Maurer

– Maler

Puppet selbst bringt die Handwerker (Provider) von Haus aus mit und die Puppet Sprache kann um beliebig viele Provider und Ressourcen erweitert werden. Dadurch das ich in Puppet meinen Zustand deklarativ und abstrakt beschreibe könnte ich z.B. auch mit Puppet ein Hochhaus, ein Schiff, ein Flugzeug oder vielleicht sogar ein Raumschiff beschreiben und bauen lassen, sofern es die entsprechenden Handwerker/Provider dafür gibt. :-)

Puppet hat daneben noch viel mehr Vorteile. Standardmäßig überprüft Puppet alle 30 Minuten den gewünschten Bauplan meines Hauses mit dem aktuellen Zustand. Sollte also jemand hingehen und meine Außenwand z.B. mit einem Graffiti verunstalten (in Puppet Sprache ein Configuration Drift) würde Puppet automatisch den gewünschten Systemzustand wieder herbeiführen und die Wand in der gewünschten Farbe überstreichen.

Da ich natürlich nicht der einzige bin der ein Wunschhaus bauen möchte würde ich jetzt meinen Bauplan in einen generellen Bauplan (ein sogenannte Puppet Klasse) für alle zur Verfügung stellen und konfigurierbar machen. Hier wäre als Beispiel ein kleiner Ausschnitt meiner konfigurierbaren Klasse MeinWunschaus:

class MeinWunschhaus {
$MaterialBeton => 'Beton',
....
Fundament { 'Mein Fundament':
Material => $MaterialBeton,
.....
}

Diese Klasse packe ich dann in ein sogenanntes Puppet Modul uns mach es für alle Hausbauer auf dieser Welt verfügbar. Wenn jemand weitere Ressourcen und Attribute beschreiben möchte kann er dies natürlich gerne tun und den Nutzen des Moduls somit erweitern. Die Community Hausbauer würde den Umfang des Moduls dann nach und nach erweitern. Somit ist dann jeder in der Lage ein Wunschhaus zu bauen.

Dieses Konzept lässt sich dann wunderbar auf die IT übertragen. Ich zerlege mit Puppet also meine komplexe IT Landschaft in alle Einzelteile (Ressourcen) z.B. : Benutzer, Gruppen, Firewall, Softwarepakete, Datenbank, Netzwerkkomponenten, Storage, etc. und beschreibe den gewünschten Systemzustand meiner IT Ressourcen und die Abhängigkeiten untereinander. Puppet übernimmt dann die Arbeit und überführt den aktuellen Zustand meiner IT mittels Provider auf den jeweiligen Systemen in den gewünschten Systemzustand.

Ja, ich weiss. Es ist sehr einfach beschrieben und sehr abstrakt. Aber dafür sollte jetzt jeder verstanden haben wie Puppet funktioniert und was man mit Puppet in seiner IT machen kann/könnte :-)



Viewing all articles
Browse latest Browse all 19