\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 auf der Basis von Virtualbox und anderen Virtualisierungslösungen schnell und reproduzierbar virtuelle Maschinen zu starten. Die Einstellungen hierfür werden in der Datei \emph{Vagrantfile} hinterlegt, welche Vagrant beim Start einliest. Vagrant kann Chef beim Erstellen von virtuellen Maschinen integrieren. Es bietet Optionen, mit welchen Einstellungen neue virtuelle Maschinen provisioniert werden sollen. Zum Einsatz kam das Betriebssystem Ubuntu in der Version 12.04. Das Basisimage hierfür wurde von \emph{Chef}, der gleichnamigen Firma, bereitgestellt. Für die Kommunikation mit Vagrant wurde das Netzwerkinterface \emph{eth0} konfiguriert. Ein weiteres Netzwerkinterface (\emph{eth1}) wird für das interne virtuelle Netzwerk zwischen den VMs zum Betreiben der Netzwerkdienste benötigt. Vagrant bietet für diese erweiterten Einstellungen keine Optionen. Um diese dennoch zu übernehmen, waren spezielle Kommandozeilenargumente an den Befehl \emph{VBoxManage} nötig, welches von Vagrant für Virtualbox genutzt wird. Dies schränkt die Nutzung allerdings auf den Hypervisor Virtualbox ein. Vagrant bietet die Möglichkeit, neben Provisionierungsystemen auch Shellskripte auszuführen. Diese wurde genutzt, um Chef auf die, zum damaligen Zeitpunkt, aktuellste Version 11.8.2 zu aktualisieren. Desweiteren wird Ruby auf dem Host benötigt, um beispielsweise die Tests ausführen zu können. Auf Unix-Ähnlichen Systemen kann dies 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 internen 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 Berkssfile angegeben (vergleichbar mit \href{http://bundler.io/}{Gemfiles} in Ruby). Berkshelf unterstützt dabei verschiedene Quellen (per Api von der Communityseite von Opscode, 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 geteilte Ordner zwischen VM und Host, müssen die \emph{virtualbox-client-modules} in der VM installiert sein. Diese sind in meisten vielen Images vorhanden, die es für Vagrant gibt. Allerdings muss die Virtualboxversion 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 installiert das Plugin die die gleiche Version des Modules in der VM. Wenn Virtualbox mit Linux als Hostsystem ausgeführt wird, sollte das Kernelmodule \emph{vboxdrv} geladen sein. Manche Linux-Distributionen installieren dieses Module bereits während der Installation von Virtualbox. Auf MacOS X und Windows sind keine weiteren Schritte notwendig. Beide Plugins werden 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: Als Netzwerkdienste wurden die Protokolle DHCP, DNS und NTP gewählt. Die VMs wurden in die zwei Gruppen \emph{Headnodes}und \emph{Computenodes} geteilt. Die Headnode bietet die genannten Dienste an. Die Computenodes fordern auf dem internen Netzwerk per DHCP eine IP-Adresse an und nutzen den DNS- und NTP-Dienst der jeweiligen Headnode. Die Attributes der Roles und der Node wurden in JSON-Dateien in den Verzeichnissen \emph{roles/} und \emph{nodes/} abgelegt. Es gibt je eine Role-Datei für Computenodes und Headnodes. In der aktuellen Konfiguration erzeugt Vagrant eine Headnode mit der FQDN \emph{node0.lctp} und zwei Computenodes (\emph{node1.lctp} und \emph{node2.lctp}). Für das Deployment wurden fünf Cookbooks geschrieben: \begin{description} \item[bind] Als DNS-Server wurde bind gewählt. Das Cookbook richtet diesen Dienst ein und fügt, die in den Attributes 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 Wrappercookbook um das \href{https://github.com/redguide/network_interfaces}{network\_interfaces} Cookbook. Wrappercookbooks werden häufig dazu benutzt um bestehende Cookbooks aus anderen Quellen um Funktionalität zu erweitern. In diesem Fall aktiviert das Cookbook für die Computenodes DHCP auf dem interen Netzwerkinterface. Auf den Headnodes wird eine statische IP-Adresse gesetzt, der DNS-Server auf localhost festgelegt und IP-Forwarding sowie Masquerading via iptables für den Routerbetrieb aktiviert. \item[ntp] Dieses Cookbook richtet den NTP-Deamon ein, welcher die Zeit zwischen den einzelnen Knoten synchron halten soll. \item[main] Dieses Cookbook fasst alle oben genannten Cookbooks für Compute- und Headnode zusammen. Man könnte dies prinzipiell auch in den jeweiligen Rollen erledigen. Rollen in Chef haben allerdings den Nachteil, dass diese nicht versionierbar 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] bringt die lokalen Paketquellen auf den aktuellen Stand und aktualisiert den Paketcache. \item[network\_interfaces] verwaltet Debians Netzkonfiguration /etc/network/interfaces. \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_de