\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
