From 62a90a347a1dfc778f1d649f1e0798bee8cdb22e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Thalheim?= Date: Tue, 1 Apr 2014 18:27:37 +0200 Subject: [PATCH] chef: Vergleich weiter fortgeschritten --- bericht/bericht.tex | 2 +- bericht/chef/chef-comparison.tex | 192 ++++++++++++++++++++++++++++--- bericht/sources.bib | 10 +- 3 files changed, 186 insertions(+), 18 deletions(-) diff --git a/bericht/bericht.tex b/bericht/bericht.tex index 03a3e83..56b6822 100644 --- a/bericht/bericht.tex +++ b/bericht/bericht.tex @@ -8,7 +8,7 @@ \usepackage{courier} \usepackage{microtype} \usepackage{pgfplots} -\pgfplotsset{compat=1.3} +\pgfplotsset{compat=newest} \usepackage{epigraph} \setlength\epigraphwidth{8cm} diff --git a/bericht/chef/chef-comparison.tex b/bericht/chef/chef-comparison.tex index 29a71d1..7cfda2a 100644 --- a/bericht/chef/chef-comparison.tex +++ b/bericht/chef/chef-comparison.tex @@ -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ß , 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ß , 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 diff --git a/bericht/sources.bib b/bericht/sources.bib index bdba541..e6edfbb 100644 --- a/bericht/sources.bib +++ b/bericht/sources.bib @@ -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} +}