\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