\subsubsection{Funktionsweise von Chef}
\label{ssub:funktionsweise_von_chef}

\href{http://www.getchef.com/chef/}{Chef} ist ein Framework, welches es
ermöglicht automatisiert Server zu konfigurieren und zu verwalten. Der
Endanwender beschreibt hierbei die Systemresourcen und ihre Zustände in der
Programmiersprache \href{https://www.ruby-lang.org/}{Ruby}. Diese Definitionen
werden von \emph{Chef-client} eingelesen und in notwendige Aktionen übersetzt,
welche ausgeführt werden müssen, um den beschriebenen Zustand umzusetzen.

Die Gesamtheit aller Definitionen/Einstellungen nennt man das \emph{Chef-repo}.
Diese untergliedert sich in mehrere \emph{Cookbooks}\label{cookbook}, welche die
Grundverwaltungseinheit darstellt. Jedes dieser Cookbooks, erfüllt einen
bestimmten Teilaspekt des Systems, (z.B. die Einrichtung eines Webservers
\href{https://github.com/opscode-cookbooks/apache2}{Apache}). Coobooks
können versioniert werden. Es können Abhängigkeiten zwischen mehreren
Cookbooks angegeben werden.

Eine physikalische oder virtuelle Maschine wird als \emph{node} bezeichnet.
Einer Node können \emph{Attributes}, \emph{Roles} und Cookbooks zugewiesen
werden. Roles bieten eine Möglichkeit Nodes, welche die gleiche
Aufgaben in einer Organisation besitzen, zu gruppieren (z.B. webserver).

Es gibt mehrere Möglichkeiten \emph{Chef} zu betreiben:

\begin{description}
  \item[chef-solo] Dies ist die einfachste Ausführungsform. Hierbei wird lädt
    \emph{Chef-client} alle nötigen Daten aus einem lokalen Verzeichnis. Diese
    Form wurde für die Umsetzung der Aufgabenstellung.
  \item[chef-server] Hierbei authentifiziert sich \emph{Chef-client} über eine
    \emph{REST-Api} zu einem \emph{chef-server} mittels Zertifikaten. Auf diesem
    wird das Chef-repo zentral verwaltet. Der Chef-client bekommt von diesem
    alle nötigen für die zu provisionierende \emph{node}. Chef-server bietet
    eine Weboberfläche für die Administrierung an. Die Attribute aller Nodes sind
    über die eingebaute Suchemaschine \emph{Solr} durchsuchbar.
  \item[Enterprise Chef/Hosted Enterprise Chef] Ähnlich wie Chef-server aber
    bietet bessere Skalierbarkeit, rolenbasierte Benutzerverwaltung, bessere Überwachung,
    Push-Deployment und eine verbesserte Weboberfläche~\cite{chefenterprise}
\end{description}

\textbf{Aufbau eines Cookbook}
\label{aufbau_eines_cookbook}

Hier ist die Ordnerstruktur des Cookbook apt (TODO Link) dargestellt:

\begin{lstlisting}
> apt-2.3.4/
  > attributes/
      default.rb
  > files/
    > default/
        apt-proxy-v2.conf
  > libraries/
      helpers.rb
      network.rb
  > providers/
      preference.rb
      repository.rb
  > recipes/
      cacher-client.rb
      cacher-ng.rb
      default.rb
  > resources/
      preference.rb
      repository.rb
  > templates/
    > debian-6.0/
    > default/
        01proxy.erb
        acng.conf.erb
    > ubuntu-10.04/
        acng.conf.erb
    CHANGELOG.md
    metadata.json
    metadata.rb
    README.md
\end{lstlisting}

Die Verzeichnisnamen sind fest vorgeben. Jedes Verzeichnis hat seine eigene
Funktion. Dies hat den Vorteil, das man sich schnell in neuen Cookbooks zurecht
findet. Hier nochmal die einzelnen Verzeichnisse im Überblick:

\begin{description}
  \item[attributes] setzt Standardwerte (Attribute) für das Cookbook. Dies
    können Strings, Zahlen oder Arrays sein. Die gesetzten Attribute können in
    Roles, Nodes oder anderen Cookbooks überschrieben werden. Hierfür gibt es
    die Prioritäten default, force\_default, normal und override um das
    überschreiben deterministisch zu machen. Attributes sind hierarchisch
    organisiert. In der Regel ist die höchste Ebene der Name des Cookbooks.
    (z.B. normal.mysql.client.packages)
  \item[files] Hier können statische Dateien eingefügt werden, welche dann auf
    dem Zielsystem in das entsprechende Verzeichnis kopiert werden können.
  \item[libraries] In diesem Verzeichnis können Hilfsfunktionen definiert werden.
  \item[resources] Ressourcen beschreiben, die Bestandteile eines Systems. Eine
    Ressource kann z.B. eine Datei, ein Prozess oder ein Packet sein. Man
    beschreibt, welchen Zustand (action in Chef genannt) diese Ressource haben
    soll und Chef versucht diesen Zustand  herzustellen. Chef liefert von Haus
    viele wichtige Ressourcen mit. In Cookbooks kann man darüber hinaus eigene
    Ressourcen definieren.
  \item[providers] Während Ressourcen nur die Schnittstelle beschreiben, mit
    allen Attributen, die gesetzt werden können, ist der Provider eine konkrete
    Implementierung. Deswegen muss jede Ressource mindestens einen Provider
    besitzen. Es kann mehrere Provider für eine Ressource geben, um zum Beispiel
    um mehrere Plattformen/Betriebssysteme abzudecken (z.B. bei Packetmanagern
    oder Initsystemen).
  \item[recipes] In Recipes werden Ressourcen instantiiert, welche nötig sind
    um die gewünschte Aufgabe zu erreichen. Dabei können Abhängigkeiten zwischen
    diesen angegeben werden.
  \item[templates] Häufig werden dynamisch generierte Dateien benötigt, um zum
    Beispiel Konfigurationsdateien zu erzeugen. Chef bindet hierfür die
    Templatesprache eRuby (Embedded Ruby) ein. Diese führt in den Templates
    Rubycode, der sich zwischen den Tags \emph{<\%} und \emph{\%>} befindet, aus.
    Dies erlaubt es Variablen zu interpolieren, sowie If-Statements und
    Schleifen.
  \item[metadata.rb] In dieser Datei kann der Name des Cookbook, die Version,
    eine Beschreibung sowie Abhängigkeiten zu anderen Cookbooks angeben werden.
\end{description}

\textbf{Durchlauf eines Recipes}
\label{durchlauf_eines_recipes}

TODO Runlist

\textbf{Vergleich mit puppet}
\label{vergleich_mit_puppet}

% vim: set spell spelllang=de_de
