\subsection{Einrichtung der Netzwerkdienste} \label{sub:einrichtung-der-netzwerkdienste} Für die Provisionierung der Netzwerkdienste wurde \href{http://vagrantup.com}{Vagrant} verwendet. Dies ist ein Programm, um schnell und reproduzierbar virtuelle Maschinen für Virtualbox und andere Virtualsierungslösungen zu erstellen und zu starten. Die Einstellungen hierfür werden in der Datei \texttt{Vagrantfile} hinterlegt, welche Vagrant beim Start einliest. Vagrant kann Chef beim Erstellen von virtuellen Maschinen integrieren. Zum Einsatz kam das Betriebssystem Ubuntu in der Version 12.04. Das Basisimage hierfür wurde von \texttt{Chef}, der gleichnamigen Firma, bereitgestellt. Für die Kommunikation mit Vagrant wurde die virtuelle Netzwerkkarte \texttt{eth0} konfiguriert. Ein weitere Karte (\texttt{eth1}) wird für das interne virtuelle Netzwerk zwischen den VMs zum Betreiben der Netzwerkdienste benötigt. Vagrant bietet keine Optionen, ein virtuelles Netzwerk zu erstellen, ohne das jeder VM eine IP-Adresse fest oder DHCP unmittelbar nach dem Start zugewiesen wird. In dem genannten Netzwerk sollte allerdings DHCP von dem Head-Node bereit gestellt werden. Deswegen waren zusätzliche Kommandozeilenargumente an den Befehl \texttt{VBoxManage} im Vagrantfile nötig, welches von Vagrant genutzt wird um Virtualbox zu verwalten. Dies schränkt die Nutzung allerdings auf den Hypervisor Virtualbox ein. Des weiteren wird Ruby auf dem Host benötigt, um beispielsweise die Tests ausführen zu können. Auf Unix-Ähnlichen Systemen kann man diese Programmiersprache mit dem Befehl: \shellcmd{curl -sSL https://get.rvm.io | bash -s stable} installiert werden. Auf dem Betriebssystem Windows kann auf den \href{http://rubyinstaller.org/}{RubyInstaller} zurückgegriffen werden. Um die benötigten Ruby-Bibliotheken zu installieren, müssen folgende 2 Befehle im Projektverzeichnis ausgeführt werden: \shellcmd{gem install bundler} \shellcmd{bundle install} Zur Verwaltung der externen und selbst geschriebenen Cookbooks wurde die Abhängigkeitsverwaltung \href{http://berkshelf.com}{Berkshelf} verwendet. Bei diesem werden die zu ladenden Cookbooks und die gewünschte Version in einer Datei namens Berksfile angegeben (vergleichbar mit \href{http://bundler.io}{Bundler} und Gemfiles in Ruby). Berkshelf unterstützt dabei verschiedene Quellen (per API von der Communityseite von Chef, Git, lokal) und kann Abhängigkeiten zu anderen Cookbooks auflösen. Um die Cookbooks initial zu laden, muss der Befehl: \shellcmd{berks install} im Projektverzeichnis ausgeführt werden. Für das Zusammenspiel mit Vagrant gibt es das Plugin \href{https://github.com/berkshelf/vagrant-berkshelf}{vagrant-berkshelf}, so dass die von Berkshelf verwalteten Cookbooks auch in Vagrant zur Verfügung stehen. Für bestimmte Funktionen, wie Gemeinsame Ordner (shared folders) zwischen VM und Host, müssen die \texttt{virtualbox\--client\--modules} in der VM installiert sein. Diese sind in vielen Images bereits vorhanden, die es für Vagrant gibt. Allerdings muss die Virtualbox-Version des Host mit der Version in der VM übereinstimmen. Abhilfe schafft das Vagrantplugin \href{https://github.com/dotless-de/vagrant-vbguest}{vagrant-vbguest}. Beim Start der VM installiert das Plugin die gleiche Version des Modul in der VM. Wenn Virtualbox mit Linux als Host-System ausgeführt wird, muss das Kernelmodule \texttt{vboxdrv} geladen sein. Manche Linux-Distributionen installieren dieses Module bereits während der Installation von Virtualbox. Auf Mac OS X und Windows sind keine weiteren Schritte notwendig. Beide Plugins werden mit den Befehlen: \shellcmd{vagrant plugin install vagrant-vbguest} \shellcmd{vagrant plugin install vagrant-berkshelf} installiert. Gestartet wird die VM mit dem Befehl: \shellcmd{vagrant up} Während des ersten Starts wird die VM mit Chef provisioniert. Später kann Chef erneut mit Befehl: \shellcmd{vagrant provision} gestartet werden. Die Netzwerkdienste sollen die Protokolle DHCP, DNS und NTP bereitstellen. Es wird wie im Praktikum zwischen \texttt{Head-Nodes} und \texttt{Compute-Nodes} unterschieden. Die Head-Node bietet die genannten Dienste an. Die Compute-Nodes fordern auf dem internen Netzwerk per DHCP eine IP-Adresse an und nutzen den DNS- und NTP-Dienst der ihr zugewiesenen Head-Node. Die Attribute für die Rollen und den Nodes wurden in JSON-Dateien in den Verzeichnissen \texttt{roles/} und \texttt{nodes/} abgelegt. Es gibt je eine Rollen-Datei für Compute-Nodes und Head-Nodes. In der aktuellen Konfiguration erzeugt Vagrant eine Head-Node mit der FQDN \texttt{node0.lctp} und zwei Compute-Nodes (\texttt{node1.lctp} und \texttt{node2.lctp}). Es wurden fünf Cookbooks geschrieben: \begin{description} \item[bind] Für Bereitstellung des DNS-Dienstes wird Named aus dem BIND-Packet installiert. Das Cookbook richtet diesen Dienst ein und fügt die in den Attributen konfigurierten DNS-Einträge zu den entsprechenden Zonen hinzu. \item[dhcp] Dieses Cookbook richtet den \href{https://www.isc.org/downloads/dhcp/}{ISC-DHCP-Server} ein. Neben der Zuordnung von festen IP-Adressen zu Nodes, kann ein DNS-Server und ein NTP-Server festgelegt werden. \item[lctp-network] Dieses Cookbook ist ein Wrapper um das \href{https://github.com/redguide/network_interfaces}{network\_interfaces} Cookbook. Wrapper-Cookbooks werden häufig dazu benutzt um bestehende Cookbooks aus anderen Quellen um Funktionalität zu erweitern. Für Compute-Nodes aktiviert das Cookbook für die DHCP in dem virtuellen Netzwerk. Im Falle eines Head-Nodes wird eine statische IP-Adresse gesetzt, der DNS-Server auf localhost festgelegt und IP-Forwarding sowie Masquerading via iptables für den Router-Betrieb aktiviert. \item[ntp] Dieses Cookbook richtet den NTP-Deamon ein, welcher die Zeit zwischen den einzelnen Nodes synchronisiert. \item[main] Dieses Cookbook fasst alle oben genannten Cookbooks für Compute- und Head-Node zusammen. Man könnte dies prinzipiell auch in den jeweiligen Rollen erledigen. Rollen haben allerdings den Nachteil, dass diese im Gegensatz zu Cookbooks nicht versionierbar sind und (bei Chef-Server) über alle Umgebungen identisch sind. Somit ist eine Trennung zwischen Test- und Produktivumgebung schwierig. \end{description} Es wurden folgende externen Cookbooks verwendet: \begin{description} \item[apt] aktualisert die lokalen Paketlisten und den Paketcache. \item[network\_interfaces] verwaltet Debian's Netzkonfiguration \item[minitest-handler] Sammelt alle Tests in den Cookbooks und führt diese nach der Provisionierung aus (siehe~\ref{minitest_handler}). \end{description} % vim: set spell spelllang=de_dihr zugewiesenen e