12. Okt 2020
Lesedauer 7 Min.
Puppet und Ansible im Vergleich
Systeme konfigurieren
Sowohl Ansible als auch Puppet sind Konfigurationsmanagement-Werkzeuge. Beide verfolgen jedoch unterschiedliche Ansätze, um ihre Aufgaben zu erfüllen.

Das Konfigurationsmanagement als Disziplin wurde bereits in einem ersten Artikel vorgestellt [1]. Die Idee ist, dass DevOps-Engineers über diese Kategorie von Diensten in die Lage versetzt werden, die Verwaltung von Diensten und Softwarepaketen auf den Zielsystemen zu automatisieren.In diesem Kontext wurde bereits umrissen: Puppet ist ein deklaratives System, um einen gewünschten Ist-Zustand auf den Zielsystemen festzulegen und ihn auch zu erhalten. Die Kernfunktionalität von Puppet ist also, auf den verwalteten Knoten zu prüfen, ob die Konfiguration der Softwarepakete dem entspricht, was in einem Katalog festgelegt ist, der durch die Knoten von einem Masterknoten abgerufen wird.Ist die Konfiguration nicht identisch – das kann zum Beispiel der Fall sein, weil die Konfiguration am Master verändert wurde oder weil ein Anwender manuell etwas auf einem Knoten verändert hat –, so wird versucht, wieder den festgelegten Zielzustand zu erreichen.Ansible stellt hingegen nur einen Mechanismus zur Verfügung, um auf mehreren Rechnern sogenannte Playbooks auszuführen. Playbooks stellen hierbei standardisierte Funktionalitäten dar, wie zum Beispiel, dass neue Software installiert wird oder dass Services aktiviert werden. Sie funktionieren somit distributionsübergreifend.Es ist demnach möglich, zu umreißen, dass der vielleicht wesentlichste Unterschied zwischen beiden Systemen der ist, dass Puppet Knoten komplett verwaltet, während Ansible nur Funktionalität gesteuert auf mehreren Knoten ausführt.Man könnte meinen, dass Puppet mehr und komplexere Funktionalität als Ansible bereitstellt und deshalb dieses Werkzeug auch weiter verbreitet sein müsste. Im Zuge von Cloud-Strategien sind Lösungen gefragt, in denen man einzelne Knoten erstellen und zu einem späteren Zeitpunkt auch wieder zerstören kann. Eine dauerhafte Verwaltung von laufenden Knoten ist deshalb nicht mehr der letzte Schrei einer innovativen Architektur. Eine klassische Anwendung ist es demnach, neue Knoten mit Terraform zu provisionieren und gegebenenfalls einzelne Konfigurationsschritte mit Ansible zu tätigen. Wird der Knoten nicht mehr gebraucht, werden die Ressourcen wieder freigegeben.Die traditionelle Puppet-Funktionalität ist also bereits nicht mehr zeitgemäß. Daher bietet Puppetlabs mit Bolt eine Lösung an, die in die Kerbe von Ansible schlägt. Bolt ist jedoch nicht Teil dieses Artikels.Trotz dieses Statements, dass Puppet – abgesehen von Bolt – bereits etwas veraltet ist, sollte aber betont werden, dass immer noch viele Softwareschmieden auf Puppet schwören und auch die Verwaltung ganzer Knoten nicht obsolet werden wird.
es wird auch ein Ausblick darauf gegeben, wie man weiter damit arbeiten kann.
Die Aufgabe: Vim installieren
Vim ist ein unverzichtbares Werkzeug für viele System-Engineers und Entwickler. Auch wenn die Lernkurve dieses Editors hoch ist, wird ein geübter Entwickler, der alle Tastenkürzel in Vim beherrscht, seine Aufgaben schneller erledigen als jeder, der in einer IDE mit der Maus hantiert.Daher ist die Installation von Vim unsere kleinste ausführbare Referenzaufgabe, die wir im Folgenden einmal mit Ansible und einmal mit Puppet lösen wollen. Dies soll ausreichen, um als Leser ein Gefühl dafür zu bekommen, wie es weitergehen könnte.Mit diesem Verständnis soll jeder Entwickler befähigt sein, eine Entscheidung zu treffen, welches Werkzeug interessanter ist, undes wird auch ein Ausblick darauf gegeben, wie man weiter damit arbeiten kann.
Vim-Installation mit Ansible
Jeder Leser sollte in der Lage sein, Ansible herunterzuladen und zu installieren. Auch sollte jeder Entwickler es schaffen, ein GitHub-Repository lokal zu klonen, um diese Schritte nachvollziehen zu können.Nach der Installation von Ansible holen wir uns das Repository unter [2] auf den Rechner. Wir sehen dort ein sogenanntes Ansible Playbook (Bild 1).
Der Workflowvon Ansible(Bild 1)
Autor
---
- name: This is a hello-world example
hosts: localhost
tasks:
- name: Create a file called '/tmp/testfile.txt'
with the content 'hello world'.
copy:
content: hello world
dest: /tmp/testfile.txt
Um dieses Playbook zu starten, nutzen wir folgenden Befehl:
ansible-playbook HelloWorld.yml
Das Ergebnis sehen wir uns mit diesem Befehl an:
cat /tmp/testfile.txt
Wir haben also über dieses Playbook eine Textdatei erzeugt (Bild 2).

Ansibleist ausgeführt(Bild 2)
Autor
Werfen wir nun einen Blick auf das Skript, um vom Ergebnis auf die Funktionalität rückzuschließen. Der Bezeichner name beschreibt eine Überschrift. Wir sehen, dass auch weitere Funktionalität über Key-Value-Paare und über Einrückungen festgelegt ist. Das ist Teil des YAML-Standards.Der erste Teil, der mit hosts definiert wird, beschreibt, dass alles lokal erledigt wird. Wären wir in einem Rechnerverbund, könnten wir hier mehrere Knoten angeben. Dann könnten wir ein simples testfile.txt auf beliebig vielen Knoten ablegen.Schauen wir uns die Ausführung an. Der definierte Copy-Task enthält eine Gruppierung. Er definiert zwei Parameter: den Inhalt der Zieldatei und den Zielort.Es gibt eine ganze Reihe unterschiedlicher Tasks, die wir definieren und dann betriebssystemunabhängig verteilen können. Eine vollständige Referenz aller Kommandos kann unter [3] eingesehen werden.Was wäre jetzt der Task, um Vim zu installieren? Hier kann man sich die zweite Datei im Repository ansehen, die den Task package verwendet. Wer dieses Ansible-Skript ausführt, wird sehen, dass damit ein Vim-Editor über den Paketmanager installiert wird.
---
- name: install vim
hosts: localhost
tasks:
- name: install a package
package:
name: vim
state: installed
Das Modul für das Ausrollen eines Pakets ist package.
Vim-Installation mit Puppet
Nun ist es an der Zeit, dass wir Ansible mit Puppet vergleichen (Bild 3).
Ausführungvon Puppet(Bild 3)
Autor
Für die verschiedenen Linux-Distributionen gibt es unterschiedliche Prozeduren, um Puppet zu installieren. Die Installationsmethoden sind auf der Webseite des Herstellers beschrieben [4].Um hier den einfachsten Case vorzustellen, kann ein Repository von Git geklont werden [5]. Es ist relativ simpel gehalten. Für die Installation gibt es ein sogenanntes PP-File, das eine Klasse festlegt, und indem wir die Funktionalität mit include deklarieren, wird diese auch aufgerufen:
# Class Definition
class viminst {
# Installing NTP Package
package {"vim":
ensure=> "present",
}
}
# Class Declaration
include viminst
Mit folgendem Befehl wird Vim auch über Puppet ausgerollt:
puppet apply demovim.pp
Vom Einfachen zum Komplexen
Es ist mit Kochrezepten also auf relativ überschaubare Weise möglich, erste Pakete mit Ansible oder Puppet zu installieren. Linux-Neulinge könnten vielleicht bei den Vorbereitungsaufgaben, wie dem Installieren der Frameworks, ein wenig aufgehalten werden. Wenn jedoch alles korrekt installiert ist, ist es nur eine Frage dessen, syntaktisch Codefiles zu erstellen und diese dann in einem Befehl zu referenzieren. Also keine Hexerei für Programmierer.Doch sind wir bislang auf einem Niveau, bei dem wir auch ohne Ansible und Puppet auskommen. Wenn wir zum Beispiel auf Azure eine Linux-Instanz hochfahren, reicht auch eine Kenntnis der Paketmanager der Distribution aus, um mit einem Einzeiler ein Paket zu installieren.Die Bedeutung von Werkzeugen wie Ansible und Puppet wird dann deutlich, wenn wir in einer Infrastruktur arbeiten, bei der wir mehrere Knoten parallel und wiederholt ausrollen müssen und wir uns dabei nicht zu jedem Knoten manuell verbinden wollen. Wird Vim als Standardeditor gesehen und soll dieser Editor auf allen neuen Instanzen installiert sein, kann ein Konfigurationsmanagement-Werkzeug erste Wirkung zeigen. Und ab einer gewissen Komplexität der Installationen werden diese Werkzeuge sogar unverzichtbar, da simple Bash-Skripte oft zu wenig generisch sind, um eine komplette Konfiguration durchzuführen.Unter [6] und [7] sind weitere Projekte zu finden, die als Templates für komplexere Projekte geeignet sind.Prinzipiell gilt, dass sich sowohl bei Puppet als auch bei Ansible einzelne Konfigurationen als Code abbilden lassen, die dann auch Serverrollen und -profile enthalten. Aus diesen Bausteinen kann ein Entwickler komplette Systeme in Code abbilden. Im Internet gibt es dazu viele Videos, und es werden zum Beispiel auf der Linux Academy auch zahlreiche Kurse zu Ansible und Puppet angeboten, die alle Details dazu enthalten, wie man von einfachen Skripten zu einem kompletten Repository einer Verwaltung kommt.Fazit
Die Entscheidung für Ansible oder für Puppet ist eine Frage der Anwendung. Will man Knoten komplett verwalten oder will man nur die Installation automatisieren? Das wird vermutlich das wesentlichste Entscheidungsmerkmal sein.Wer Knoten komplett verwalten und auch Änderungen automatisch anpassen will, wird an Puppet oder einer der bekannteren Alternativen dazu, die ebenso Agents verwenden, wie Chef oder Saltstack, nicht vorbeikommen.Wer nur automatisiert ausrollen will, ist dagegen mit Ansible gut bedient.Wer neu in dem Thema ist und gern mit dem einsteigen will, was gefragt ist, ist gut beraten, die Kombination Terraform und Ansible zu evaluieren. Zusammen mit den Cloud-Providern und mit Kubernetes ist diese Kombination derzeit unschlagbar.Fussnoten
- Stefan Papp, Puppet, Ansible, Chef und Co. aus der Vogelperspektive, dotnetpro 6/2020, Seite 116 ff., http://www.dotnetpro.de/A2006Configuration
- dnp_ansible-Demo-Repository, http://www.dotnetpro.de/SL2011AnsiblePuppet1
- Playbook-Dokumentation, http://www.dotnetpro.de/SL2011AnsiblePuppet2
- Puppet-Installation, http://www.dotnetpro.de/SL2011AnsiblePuppet3
- dnp_puppet-Demo-Repository, http://www.dotnetpro.de/SL2011AnsiblePuppet4
- Puppet-Template, http://www.dotnetpro.de/SL2011AnsiblePuppet5
- Ansible-Template, http://www.dotnetpro.de/SL2011AnsiblePuppet6