chef: Vergleich weiter fortgeschritten

This commit is contained in:
Jörg Thalheim 2014-04-01 18:27:37 +02:00
parent 953f4c4312
commit 62a90a347a
3 changed files with 186 additions and 18 deletions

View File

@ -8,7 +8,7 @@
\usepackage{courier}
\usepackage{microtype}
\usepackage{pgfplots}
\pgfplotsset{compat=1.3}
\pgfplotsset{compat=newest}
\usepackage{epigraph}
\setlength\epigraphwidth{8cm}

View File

@ -142,8 +142,7 @@ findet. Hier nochmal die einzelnen Verzeichnisse im Überblick:
Cookbooks angegeben werden.
\end{description}
Beispiel ERB-Template:
\begin{lstlisting}
\begin{lstlisting}[caption={Beispiel ERB-Template:}]
Diese Zeile wird beim Rendern ohne Aenderung uebernommen
<%# Ein Kommentar%>
@ -228,21 +227,184 @@ Mechanismus genutzt um Tests auszuführen.
\subsubsection{Vergleich mit puppet}
\label{vergleich_mit_puppet}
Ein anderes weiteres verbreitetes Konfigurationsmanagmentsystem ist Puppet. Es
ist das ältere der beiden Projekte. Während die erste Puppetrelease bereits im
ist das Ältere der beiden Projekte. Während das erste Puppetrelease bereits im
Jahr 2005 von den Puppet Labs veröffentlicht wurde, erschien Chef erst 4 Jahre
später im Jahre 2009. Chef wurde stark beeinflusst von Puppet. Der Erfinder von
Chef Adam Jacob war selbst langjähriger Puppetnutzer bevor er Chef oder wie es
in den 1. Versionen hieß <TODO>, schrieb.
- Konsultantfirma: Infrastruktur bis zum Deployment
- mangelnde Abstraktionsmöglichkeiten
\cite{chefhistory}.
Chef Adam Jacob war selbst langjähriger Puppetnutzer, bevor er Chef schrieb.
Seine damalige Konsultantfirma betreute mehrere Firmen bei der Provisionierung
der Infrastruktur bis hin zum Deployment der Anwendung. Dabei kam Puppet zum
Einsatz. Mit steigender Anzahl der Kunden, stieg nach Aussagen von Adam Jacob
der Aufwand bei der Verwaltung der Puppet-Konfiguration. Diese mussten häufig
für jeden Kunden stark angepasst oder neugeschrieben werden. Aus diesem Grund
began er an ein neues Deploymentsystem zu schreiben, damals unter dem Namen
\emph{Marionette}. Dabei verwendete ebenfalls wie schon bei Puppet die
Programmiersprache Ruby zur Implementierung des Clients. Ein wichtiges
Designziel seines neues System war es, bessere Abstraktionsmöglichkeiten zu
schaffen, um so die Wiederverwendbarkeit zu erhöhen (Quelle:
\cite{chefhistory}). Anzumerken ist, das seit der damals veröffentlichten
Puppetversion
(\href{https://github.com/puppetlabs/puppet/commit/ce964ecb6d6a38cb7fb9f0b13a7e6b2eb4c381c3}{0.24.5})
neue Funktionen und Spracherweiterungen zu Puppet hinzugefügt wurden um dieses
Problem zu adressieren.
(\cite{puppetlanguagechangelog})
Während bei Chef die Konfiguration in Ruby geschrieben wird, besitzt Puppet
seine eigene Konfigurationssprache. Puppets Sprache ist im Gegensatz zu
General-Purpose-Languages wie Ruby, Java oder C/C++ eine
Domain-Specific-Language (DSL). Eine DSL ist eine eigens für den Anwendungszweck
geschriebene und optimierte Sprache. Sie enthält häufig Elemente und Ausdrücke,
welche es erlauben Probleme der Anwendungsdomain effizient zu lösen. Auf der
anderen Seite wird verzichtet auf umfangreiche Standardbibliotheken und
Sprachkonstrukte verzichtet, die in General-Purpose-Language üblich sind.
Puppets Sprache wurde an das Konfigurationsformat von Nagios angelehnt
(\cite{puppetlanguage}). Sie ist deklarativ gehalten und soll möglichst einfach
erlernbar für Administratoren, auch ohne programmiertechnischen Hintergrund,
sein. Der Schwerpunkt liegt auf der Beschreibung von \emph{Resources}. Die
Sprache besitzt Kontrollstrukturen wie Case- und If-Statements. Es gibt
Datentypen wie \emph{Strings}, \emph{Booleans}, \emph{Arrays}, \emph{Reguläre
Ausdrücke} und \emph{Hashes}, welche Variablen zugewiesen werden können. Die
\href{https://forge.puppetlabs.com/puppetlabs/stdlib}{Standartbibliothek} von
Puppet stellt Funktionen, um auf diesen Datentypen einfache Operationen
auszuführen. Allerdings ist es nicht möglich Schleifen auszuführen. (Diese
\href{http://docs.puppetlabs.com/puppet/latest/reference/experiments_lambdas.html}{Funktion}
ist momentan als experimental markiert). Funktionen können nicht direkt in
Puppets Sprache definiert werden. Stattdessen werden diese als Erweiterung des
Parsers in Ruby implementiert, was wiederum den den Nachteil hat, dass dafür
eine weitere Sprachen erlernt werden muss. Manche Unternehmen und Organisationen
greifen bevorzugt auf Puppet zurück, weil es einfacher ist neue Mitarbeiter ohne
Rubykenntnisse in diesem Framework zu schulen (TODO - Beleg). Andere wie
bevorzugen die Flexibilität von Ruby. Facebook gab dies als Einen der Gründe an,
warum sie im Jahre 2013 von \emph{CFEngine2} (TODO - Link) auf \emph{Chef 11}
umgestiegen sind.
Das strukturelle Äquivalent zu \emph{Cookbooks} in Chef ist in Puppet das
Puppet-Module. Diese werden in der Community ausgetauscht und entwickelt. Da
Puppet älter ist, ist zu erwarten das hierfür mehr Puppet-Module zu Verfügung
stehen als für Cookbooks für Chef. Die primäre Distributionsquelle ist
\href{https://forge.puppetlabs.com/}{Puppet Forge} in dem \textbf{2206}
\href{https://forge.puppetlabs.com/modules?supported=yes}{Module} zu Verfügung
stehen (Stand: 31.03.2014). Für Chef gibt es eine ähnliche
\href{http://community.opscode.com/}{Community-Seite} mit \textbf{1368}
Modulen, (Stand: 31.03.2014 - ermittelt über die
\href{https://cookbooks.opscode.com/api/v1/cookbooks?start}{API}). Zu einer
weiteren wichtigen Quelle hat sich die Plattform
\href{https://github.com}{Github} für beide Projekte entwickelt. Für einen
Vergleich wurde die Anzahl der Suchtreffer für Projekte, die die Suchbegriffe
"Chef" und "Puppet" in der Suchmaschine auf Github herangezogen. Github filtert
Forks (Abspaltungen) von Projekten aus den Suchergebnissen heraus und
schlüsselt die Ergebnisse nach Programmiersprache auf. Es werden alle
Programmiersprachen in beide Projekte mit weniger als 100 Suchtreffer aus
Übersichtlichkeitsgründen nicht in das in Diagramm übernommen (siehe Tabelle). Kurze
Stichproben der Suchergebnisse, dass die Suchtreffer sich überwiegend mit den
eigentlichen Projekten Chef und Puppet beschäftigen. Anzumerken ist, das
Zielgruppe von Puppet eher Systemadminstratoren sind, während Chef auch von
vielen Entwicklern genutzt wird, wobei Letztere bevorzugt Github verwenden.
\begin{figure}[H]
\pgfplotstableread{
%Gesamt Puppet Ruby Shell Python Javascript Perl
12661 0 9902 321 148 124 42
14325 7315 3108 751 207 157 137
}\dataset
\definecolor{bblue}{HTML}{4F81BD}
\definecolor{rred}{HTML}{C0504D}
\definecolor{ggreen}{HTML}{9BBB59}
\definecolor{ppurple}{HTML}{9F4C7C}
\begin{tikzpicture}
\begin{axis}[ybar,
width=\textwidth,
enlarge x limits=0.5,
height=15cm,
ymin=0,
ymax=17000,
scaled x ticks = false,
scaled y ticks = false,
ylabel={Anzahl der Suchtreffer},
xtick=data,
xticklabels = {
\strut Chef,
\strut Puppet
},
%xticklabel style={yshift=-10ex},
major x tick style = {opacity=0},
every node near coord/.append style={
anchor=west,
rotate=90
},
legend entries={Gesamt, Puppet, Ruby, Shell, Python, Javascript, Perl},
legend columns=13,
legend style={ anchor=north west,at={(axis description cs:0,-0.1)}}
%legend style={draw=none,nodes={inner sep=10pt}},
]
\addplot[draw=black,fill=rred, nodes near coords] table[x index=0,y index=0] \dataset;
\addplot[draw=black,fill=ggreen, nodes near coords] table[x index=0,y index=1] \dataset;
\addplot[draw=black,fill=bblue, nodes near coords] table[x index=0,y index=2] \dataset;
\addplot[draw=black,fill=ppurple, nodes near coords] table[x index=0,y index=3] \dataset;
\addplot[draw=black,fill=magenta, nodes near coords] table[x index=0,y index=4] \dataset;
\addplot[draw=black,fill=yellow, nodes near coords] table[x index=0,y index=5] \dataset;
\addplot[draw=black,fill=black, nodes near coords] table[x index=0,y index=6] \dataset;
\end{axis}
\end{tikzpicture}
\caption{Anzahl der Suchtreffer auf Github aufgeschlüsselt nach
Programmiersprache für die Begriffe ``Chef'' und ``Puppet''}
\end{figure}
Rohdaten für das Diagramm
\begin{tabular}{l|c|c|c|c|c|c|c|c|c|c|c|c}
Sprache & Ruby & Puppet & Shell & Python & Javascript & Perl & PHP & Java & VimL & CSS & C & C++ \\\hline
Chef & 9,902& - & 321 & 148 & 124 & 42 & 56 & 88 & - & 31 & 48& 37 \\\hline
Puppet & 3,108& 7,315 & 751 & 207 & 157 & 137 & 82 & 42 & 64 & 23 & - & - \\
\end{tabular}
\vspace{0.5cm}
Eine andere wichtige Statistik für Opensourceprojekte ist die Subscriber auf den jeweiligen
Mailinglisten.
\begin{description}
\item[chef@lists.opscode.com] Community-Mailingliste, 1620 Leser, \href{http://lists.opscode.com/sympa/info/chef}{Quelle}, Stand: 31.03.2014
\item[chef-dev@lists.opscode.com] Entwickler-Mailingliste, 652 Leser, \href{http://lists.opscode.com/sympa/info/chef-dev}{Quelle}, Stand: 31.03.2014
\item[puppet-users@googlegroups.com] Community-Mailingliste, \textasciitilde{}7000 Leser, Quelle: \href{https://twitter.com/puppetlabs/status/450760644329881600}{Anfrage per Twitter}, Stand: 01.04.2014
\end{description}
Mailinglisten eigenen sich um qualitiv die aktive Nutzer beider Projekte zu
vergleichen. Sie ist neben dem Bugtracker ein wichtiges Mittel der
Kommmunikation.
Die Zahlen weisen darauf hin, dass Puppet nach wie vor eine größere Community
hat.
Anstelle von Recipes werden in Puppet Manifests geschrieben. Das sind Dateien,
die auf Endung .pp enden und sich in dem Ordner \emph{manifests} im
Puppet-Module befinden. Jedes Manifest definiert eine \emph{Class}. Der Namen
dieser Klasse wird aus dem Module-Namen und Manifest-Namen gebildet. Wenn Module
``foo'' das Manifest ``bar'' enthält, ist der Name der Class ``foo::bar''.
Außnahme bildet das Manifest \emph{init.pp}, bei dem die Class nur ``bar''
lauten würde. Diese Benennungskonvention wurde in Chef übernommen, um Recipes zu
referenzieren (anstelle von \emph{init.rb} lautet die Datei \emph{default.rb}).
Allerdings werden in Recipes keine seperaten Objekt definiert und der ganze
Inhalt der Datei bildet das Recipe. Eine Class in Puppet kann über Parameter
konfiguriert werden. Chef besitzt mit Attributes ein vergleichbares Konzept.
(TODO) Resources heissen in Puppet Types. Puppet liefert wie Chef eine Reihe von
Resources/Types, die Core-Types. Wie auch in Chef können Types in Puppet mehrere
plattformspezifische Provider besitzen. Es ist möglich eigene Types zu
definieren, auch Custom-Types genannt (Ähnlich LRWP in Chef). Die
Implementierung der Types/Provider erfolgt in Ruby im Verzeichnis
\emph{lib/puppet}. Die Zustände eine Resources können in Puppet über das
Schlüsselwort \emph{ensure} festgelegt werden (vergleichbar mit \emph{action}
Chef).
%- Definition
%- Parameters
%- Trennung von Daten/Code
%- Chef-Server/Puppetd-Master (masterless-Mode, Erlang)
%- Templates
%- Plattform-Unterstützung
%- bei beiden Projekte ist Clientkomponente in Ruby geschrieben.
%- Chef: Konfigurations in Ruby
%- Puppet: eine auf Puppet optimierte, vereinfachte Sprache
% -> einfacher für Einsteiger und Nicht-Programmieren
% -> Grund für manche Firmen -> wird um Umschulung zu sparen
% -> weniger flexible als Ruby (Grund bei Facebook, TODO youtube-Link, mehre Cluster mit mehr als 10.000 Nodes mit Chef provisionier)
%- Während die Regeln und Beschreibung in Chef standartmäßig in der Reihenfolge abgearbeitet
% wird in der sie geladen werden, sortiert Puppet diese um. In beiden kann die
% Reihenfolge durch Spezifikation von Abhängigkeiten umsortiert werden (Später
@ -250,8 +412,6 @@ in den 1. Versionen hieß <TODO>, schrieb.
%
%Note:
%- Puppet: eigene Sprache -> komplexere Codebasis
%- Um die Größe der Community abzuschätzen (schwierig): Suchtreffer für Repositories bei Github
%- Alter(Puppet) > Alter(Chef)
%- Chef Enterprise vs Puppet Enterprise: Hinter beiden Projekten stehen Firmen, Weiterentwicklung des Produkt, bieten Support und Hosting an
%- Resume: Ähnliche Projekte, lösen das gleiche Problem auf unterschiedliche
% Weise

View File

@ -7,7 +7,7 @@
}
@misc{chefrun,
author = {chefrun},
author = {chef},
title = {About the chef-client Run},
url = {http://docs.opscode.com/essentials_nodes_chef_run.html},
year = {2014},
@ -29,3 +29,11 @@
year = {2014},
month = {März}
}
@misc{puppetlanguagechangelog,
author = {puppetlabs},
title = {Docs: History of Puppet Language Features},
url = {http://docs.puppetlabs.com/guides/language_history.html#puppet-language-features-by-release},
year = {2014},
month = {März}
}