chef: Rechtschreibfehler und Ausdruck
This commit is contained in:
parent
6622f07302
commit
b2d77288af
@ -5,46 +5,53 @@
|
|||||||
ermöglicht automatisiert Server zu konfigurieren und zu verwalten. Der
|
ermöglicht automatisiert Server zu konfigurieren und zu verwalten. Der
|
||||||
Endanwender beschreibt hierbei die Systemresourcen und ihre Zustände in der
|
Endanwender beschreibt hierbei die Systemresourcen und ihre Zustände in der
|
||||||
Programmiersprache \href{https://www.ruby-lang.org/}{Ruby}. Diese Definitionen
|
Programmiersprache \href{https://www.ruby-lang.org/}{Ruby}. Diese Definitionen
|
||||||
werden von \emph{Chef-client} eingelesen und in notwendige Aktionen übersetzt,
|
werden von dem Program \emph{Chef-client} eingelesen und in notwendige Aktionen
|
||||||
welche ausgeführt werden müssen, um den beschriebenen Zustand umzusetzen.
|
übersetzt, welche ausgeführt werden müssen, um den beschriebenen Zustand
|
||||||
|
umzusetzen.
|
||||||
|
|
||||||
Die Gesamtheit aller Definitionen/Einstellungen nennt man das \emph{Chef-repo}.
|
Die Gesamtheit aller Definitionen/Einstellungen nennt man das \emph{Chef-repo}.
|
||||||
Diese untergliedert sich in mehrere \emph{Cookbooks}\label{cookbook}, welche die
|
Diese untergliedert sich in mehrere \emph{Cookbooks}\label{cookbook}, welche die
|
||||||
Grundverwaltungseinheit darstellt. Jedes dieser Cookbooks, erfüllt einen
|
Grundverwaltungseinheit darstellt. Jedes dieser Cookbooks, erfüllt einen
|
||||||
bestimmten Teilaspekt des Systems, (z.B. die Einrichtung eines Webservers
|
bestimmten Teilaspekt des Systems, (z.B. die Einrichtung eines Webservers
|
||||||
\href{https://github.com/opscode-cookbooks/apache2}{Apache}). Coobooks
|
\href{https://github.com/opscode-cookbooks/apache2}{Apache}). Cookbooks
|
||||||
können versioniert werden. Es können Abhängigkeiten zwischen mehreren
|
können versioniert werden. Es können Abhängigkeiten zwischen mehreren
|
||||||
Cookbooks angegeben werden.
|
Cookbooks angegeben werden.
|
||||||
|
|
||||||
Eine physikalische oder virtuelle Maschine wird als \emph{node} bezeichnet.
|
Eine physikalische oder virtuelle Maschine wird als \emph{node} bezeichnet.
|
||||||
Einer Node können \emph{Attributes}, \emph{Roles} und Cookbooks zugewiesen
|
Einer Node können \emph{Attributes}, \emph{Roles} und Cookbooks zugewiesen
|
||||||
werden. Roles und Cookbooks werden in eine sogenannte \emph{Run-list} eingefügt.
|
werden. Roles und Cookbooks werden dazu in die sogenannte \emph{Run-list} der
|
||||||
Diese gibt die Reihenfolge angibt, in welche Roles und Cookbooks angewendet
|
Node eingefügt. Diese gibt die Reihenfolge angibt, in welche Roles und
|
||||||
werden. Roles bieten eine Möglichkeit Nodes, welche die gleiche Aufgaben in
|
Cookbooks angewendet werden. Roles bieten eine Möglichkeit Nodes, welche die
|
||||||
einer Organisation besitzen, zu gruppieren (z.B. webserver).
|
gleiche Aufgaben in einer Organisation besitzen, zu gruppieren (z.B. Webserver).
|
||||||
|
|
||||||
Es gibt mehrere Möglichkeiten \emph{Chef} zu betreiben:
|
Es gibt mehrere Möglichkeiten \emph{Chef} zu betreiben:
|
||||||
|
|
||||||
\begin{description}
|
\begin{description}
|
||||||
\item[chef-solo] Dies ist die einfachste Ausführungsform. Hierbei werden alle
|
\item[Chef-solo] Dies ist die einfachste Ausführungsform. Hierbei werden alle
|
||||||
nötigen Daten aus einem lokalen Verzeichnis geladen. Im Gegensatz zu den
|
nötigen Daten aus einem lokalen Verzeichnis geladen. Im Gegensatz zu den
|
||||||
anderen Methoden wird bei dieser das Programm \emph{chef-solo} gestaret.
|
anderen Methoden heißt bei dieser das auszuführende Programm
|
||||||
Diese Form wurde für die Umsetzung der Aufgabenstellung gewählt.
|
\emph{chef-solo} statt \emph{chef-client}. Diese Form wurde für die
|
||||||
\item[chef-server] Hierbei authentifiziert sich \emph{Chef-client} über eine
|
Umsetzung der Aufgabenstellung in
|
||||||
\emph{REST-Api} zu einem \emph{chef-server} mittels eines privaten RSA-Keys.
|
Abschnitt~\ref{ssub:einrichtung-der-netzwerkdienste} gewählt.
|
||||||
|
\item[Chef-server] Hierbei authentifiziert sich \emph{Chef-client} über eine
|
||||||
|
\emph{REST-Api} zu einem \emph{Chef-server} mittels eines privaten RSA-Keys.
|
||||||
Auf diesem wird das Chef-repo zentral verwaltet. Der Chef-client bekommt von
|
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
|
diesem alle nötigen Informationen für die zu provisionierende \emph{Node}.
|
||||||
bietet eine Weboberfläche für die Administrierung an. Die Attribute aller
|
Chef-server bietet eine webbasierte GUI für die Administration an. Die
|
||||||
Nodes sind über die eingebaute Suchemaschine \emph{Solr} durchsuchbar.
|
Attribute aller Nodes sind über die eingebaute Suchemaschine \emph{Solr}
|
||||||
\item[Enterprise Chef/Hosted Enterprise Chef] Ähnlich wie Chef-server aber
|
durchsuchbar.
|
||||||
bietet bessere Skalierbarkeit, rolenbasierte Benutzerverwaltung, bessere Überwachung,
|
\item[Enterprise Chef/Hosted Enterprise Chef] Ähnlich wie Chef-server bietet
|
||||||
Push-Deployment und eine verbesserte Weboberfläche~\cite{chefenterprise}
|
aber eine bessere Skalierbarkeit, rolenbasierte Benutzerverwaltung, bessere
|
||||||
|
Überwachung, eine verbesserte Weboberfläche sowie Push-Deployment an.
|
||||||
|
Während Hosted Enterprise Chef die Firma Chef den Serverteil betreibt, ist
|
||||||
|
bei Enterprise Chef der Server in der eigenen
|
||||||
|
Organisation~\cite{chefenterprise}
|
||||||
\end{description}
|
\end{description}
|
||||||
|
|
||||||
\textbf{Aufbau eines Cookbook}
|
\textbf{Aufbau eines Cookbook}
|
||||||
\label{aufbau_eines_cookbook}
|
\label{aufbau_eines_cookbook}
|
||||||
|
|
||||||
Hier ist die Ordnerstruktur des Cookbook
|
Hier ist die Ordnerstruktur eines Cookbooks am Beispiel von
|
||||||
\href{https://github.com/opscode-cookbooks/apt}{apt} dargestellt:
|
\href{https://github.com/opscode-cookbooks/apt}{apt} dargestellt:
|
||||||
|
|
||||||
\begin{tikzpicture}
|
\begin{tikzpicture}
|
||||||
@ -87,33 +94,33 @@ findet. Hier nochmal die einzelnen Verzeichnisse im Überblick:
|
|||||||
\begin{description}
|
\begin{description}
|
||||||
\item[attributes] setzt Standardwerte (Attribute) für das Cookbook. Dies
|
\item[attributes] setzt Standardwerte (Attribute) für das Cookbook. Dies
|
||||||
können Strings, Zahlen oder Arrays sein. Die gesetzten Attribute können in
|
können Strings, Zahlen oder Arrays sein. Die gesetzten Attribute können in
|
||||||
Roles, Nodes oder anderen Cookbooks überschrieben werden. Hierfür gibt es
|
Roles, Nodes oder von anderen Cookbooks überschrieben werden. Hierfür gibt
|
||||||
die Prioritäten default, force\_default, normal und override um das
|
es die Prioritäten default, force\_default, normal und override um die
|
||||||
überschreiben deterministisch zu machen. Attributes sind hierarchisch
|
Reihenfolge zu beeinflussen. Attributes sind hierarchisch organisiert. In
|
||||||
organisiert. In der Regel ist die höchste Ebene der Name des Cookbooks.
|
der Regel ist die höchste Ebene der Name des Cookbooks. (z.B.
|
||||||
(z.B. normal.mysql.client.packages)
|
\emph{normal.mysql.client.packages})
|
||||||
\item[files] Hier können statische Dateien eingefügt werden, welche dann auf
|
\item[files] Hier können statische Dateien eingefügt werden, welche dann auf
|
||||||
dem Zielsystem in das entsprechende Verzeichnis kopiert werden können.
|
dem Zielsystem in das entsprechende Verzeichnis kopiert werden können.
|
||||||
\item[libraries] In diesem Verzeichnis können Hilfsfunktionen und
|
\item[libraries] In diesem Verzeichnis können Hilfsfunktionen und
|
||||||
Spracherweiterungen definiert werden.
|
Spracherweiterungen definiert werden.
|
||||||
\item[resources] Ressourcen beschreiben, die Bestandteile eines Systems. Eine
|
\item[resources] Ressourcen beschreiben, die Bestandteile eines Systems. Eine
|
||||||
Ressource kann z.B. eine Datei, ein Prozess oder ein Packet sein. Man
|
Ressource kann z.B. eine Datei, ein Prozess oder ein Packet sein. Man
|
||||||
beschreibt, welchen Zustand (action in Chef genannt) diese Ressource haben
|
beschreibt, welchen Zustand (Action in Chef genannt) diese Ressource haben
|
||||||
soll und Chef versucht diesen Zustand herzustellen. Chef liefert von Haus
|
soll und Chef versucht diesen Zustand herzustellen. Chef liefert von Haus
|
||||||
viele wichtige Ressourcen mit. In Cookbooks kann man darüber hinaus eigene
|
viele wichtige Ressourcen mit. In Cookbooks können man darüber hinaus eigene
|
||||||
Ressourcen definieren.
|
Ressourcen definiert werden.
|
||||||
\item[providers] Während Ressourcen nur die Schnittstelle beschreiben, mit
|
\item[providers] Während Ressourcen nur die Schnittstelle mit allen Attributes
|
||||||
allen Attributen, die gesetzt werden können, ist der Provider eine konkrete
|
beschreiben, die gesetzt werden können, ist der Provider eine konkrete
|
||||||
Implementierung. Deswegen muss jede Ressource mindestens einen Provider
|
Implementierung. Deswegen muss für jede Ressource mindestens ein Provider
|
||||||
besitzen. Es kann mehrere Provider für eine Ressource geben, um zum Beispiel
|
existieren. Es kann mehrere Provider für eine Ressource geben, um zum
|
||||||
um mehrere Plattformen/Betriebssysteme abzudecken (z.B. bei Packetmanagern
|
Beispiel um mehrere Plattformenvarianten oder Betriebssysteme abdecken zu
|
||||||
oder Initsystemen).
|
können (z.B. bei Packetmanagern oder Initsystemen).
|
||||||
\item[recipes] In Recipes werden Ressourcen instantiiert, welche nötig sind
|
\item[recipes] In Recipes werden Ressourcen instantiiert, welche nötig sind
|
||||||
um die gewünschte Aufgabe zu erreichen. Dabei können Abhängigkeiten zwischen
|
um die gewünschte Aufgabe zu erreichen. Dabei können Abhängigkeiten zwischen
|
||||||
diesen angegeben werden.
|
diesen angegeben werden.
|
||||||
\item[definitions] Ressourcen häufiger in verschiedenen Recipies auf
|
\item[definitions] Ressourcen, welche häufiger in verschiedenen Recipes auf
|
||||||
ähnliche Art und Weise benötigt werden, können diese in eine
|
ähnliche Art und Weise benötigt werden, können in eine \emph{Definition}
|
||||||
\emph{Definition} ausgelagert werden.
|
ausgelagert werden.
|
||||||
\item[templates] Häufig werden dynamisch generierte Dateien benötigt, um zum
|
\item[templates] Häufig werden dynamisch generierte Dateien benötigt, um zum
|
||||||
Beispiel Konfigurationsdateien zu erzeugen. Chef bindet hierfür die
|
Beispiel Konfigurationsdateien zu erzeugen. Chef bindet hierfür die
|
||||||
Templatesprache eRuby (Embedded Ruby) ein. Diese führt in den Templates
|
Templatesprache eRuby (Embedded Ruby) ein. Diese führt in den Templates
|
||||||
@ -126,7 +133,7 @@ findet. Hier nochmal die einzelnen Verzeichnisse im Überblick:
|
|||||||
|
|
||||||
Beispiel ERB-Template:
|
Beispiel ERB-Template:
|
||||||
\begin{lstlisting}
|
\begin{lstlisting}
|
||||||
Diese Zeile wird beim Render ohne Aenderung uebernommen
|
Diese Zeile wird beim Rendern ohne Aenderung uebernommen
|
||||||
<%# Ein Kommentar%>
|
<%# Ein Kommentar%>
|
||||||
|
|
||||||
Diese Node heisst: <%= @node.name %>
|
Diese Node heisst: <%= @node.name %>
|
||||||
@ -148,34 +155,35 @@ Beispiel ERB-Template:
|
|||||||
|
|
||||||
Der genaue Ablauf wurde der Onlinedokumentation (~\cite{chefrun}) von Chef
|
Der genaue Ablauf wurde der Onlinedokumentation (~\cite{chefrun}) von Chef
|
||||||
entnommen. Wie schon zu Beginn erwähnt wird die Provisonierung von einem
|
entnommen. Wie schon zu Beginn erwähnt wird die Provisonierung von einem
|
||||||
Programm namens \emph{chef-client} durchgeführt. Je nach Umgebung wieder kann
|
Programm namens \emph{Chef-client} durchgeführt. Je nach Umgebung kann dieser
|
||||||
dieser periodisch vom Scheduler \emph{Cron} gestartet, permanent als
|
periodisch vom Scheduler \emph{Cron} gestartet, permanent als Systemdienst
|
||||||
Systemdienst laufen (z.B. bei Enterprise Chef) oder manuell gestartet werden
|
laufen (z.B. bei Enterprise Chef) oder manuell gestartet werden (z.B. bei
|
||||||
(z.B. bei Vagrant).
|
Vagrant - siehe~\ref{ssub:einrichtung-der-netzwerkdienste}).
|
||||||
|
|
||||||
Als erstes lädt dieser seine Konfiguration aus der Datei \emph{client.rb}. In
|
Als erstes lädt dieser Prozess seine Konfiguration aus der Datei
|
||||||
dieser stehen beispielsweise Informationen mit welchen Chef-Server der Client
|
\emph{client.rb}. In dieser stehen beispielsweise Informationen mit welchen
|
||||||
verbinden soll, an welcher Stelle temporäre Daten gespeichert werden soll und
|
Chef-Server der Client sich verbinden soll, an welcher Stelle temporäre Daten
|
||||||
der Name der Node. Letzteres ist wichtig um die Node richtig von Chef einordnen
|
gespeichert werden soll und der Name der Node. Letzteres ist wichtig um die Node
|
||||||
zu können und die richtigen Einstellungen zuzuweisen. Alternativ kann der Name
|
richtig von Chef einordnen zu können und die richtigen Einstellungen zuzuweisen.
|
||||||
auch von der der Bibliothek \href{http://docs.opscode.com/ohai.html}{Ohai}
|
Alternativ kann der Name auch von der der Bibliothek
|
||||||
gesetzt werden, in dem auf den Hostnamen oder der FQDN (Fully Qualified Domain
|
\href{http://docs.opscode.com/ohai.html}{Ohai} gesetzt werden, in dem auf den
|
||||||
Name) zurück gegriffen wird. Ohai sammelt noch andere systemrelevante Daten wie
|
Hostnamen oder der FQDN (Fully Qualified Domain Name) zurück gegriffen wird.
|
||||||
Details über Hardwarekomponenten (Anzahl der CPUs, Größe und Art des RAMs,
|
Ohai sammelt noch andere systemrelevante Daten wie Details über
|
||||||
Netzwerkanbindung, Festplatten/SSDs, \dots), Informationen über die Plattform
|
Hardwarekomponenten (Anzahl der CPUs, Größe und Art des RAMs, Netzwerkanbindung,
|
||||||
(Art des Betriebssystems und Version, installierte Software) und die laufenden
|
Festplatten/SSDs, \dots), Informationen über die Plattform (Art des
|
||||||
Prozesse. Diese Informationen sind durch eigene Ohai-Plugins erweiterbar und
|
Betriebssystems und Version, installierte Software) und die laufenden Prozesse.
|
||||||
können dann im Provisionierungsprozess genutzt werden um weitere Entscheidungen
|
Diese Informationen sind durch eigene Ohai-Plugins erweiterbar und können im
|
||||||
zu treffen. Sie sind darüber hinaus auch auf dem Server gespeichert und für
|
Provisionierungsprozess genutzt werden, um weitere Entscheidungen zu treffen.
|
||||||
andere Clients abrufbar.
|
Sie sind darüber hinaus auch auf dem Server gespeichert und für andere Clients
|
||||||
|
abrufbar.
|
||||||
|
|
||||||
Nach dem alle Einstellungen eingelesen sind, folgte im Falle von Chef-Server,
|
Nach dem alle Einstellungen eingelesen sind, folgt im Falle von Chef-Server, die
|
||||||
die Authentifizierung mit diesem über den vorher auf der Node abgelegten
|
Authentifizierung mit diesem über den vorher auf der Node abgelegten
|
||||||
RSA-Schlüssel. Für Adminstratoren gibt es für den
|
RSA-Schlüssel. Für Adminstratoren gibt es für den
|
||||||
\href{http://docs.opscode.com/knife\_bootstrap.html}{Bootstraprozess}, in
|
\href{http://docs.opscode.com/knife\_bootstrap.html}{Bootstraprozess}, in
|
||||||
welchem Chef initial auf der Node installiert wird, einen Validatorkey, mit dem
|
welchem Chef initial auf der Node installiert wird, dafür einen Validatorkey.
|
||||||
eine Node auf dem Server registriert werden kann, umso einen Clientkey zu
|
Mit diesem kann eine Node auf dem Server registriert werden, umso einen
|
||||||
generieren.
|
Clientkey zu generieren.
|
||||||
|
|
||||||
Anschließend werden alte gesetzte Attributes und die Run-list vom Server
|
Anschließend werden alte gesetzte Attributes und die Run-list vom Server
|
||||||
übertragen. Beim 1. Durchlauf oder im Falle Chef-Solo sind diese Daten nicht
|
übertragen. Beim 1. Durchlauf oder im Falle Chef-Solo sind diese Daten nicht
|
||||||
@ -199,8 +207,8 @@ festgelegt.
|
|||||||
Im nächsten Schritt folgt das sogenannte Converging. Es werden alle Resources in
|
Im nächsten Schritt folgt das sogenannte Converging. Es werden alle Resources in
|
||||||
der Reihenfolge abgearbeitet. Dabei wird für jede Resource der für die Plattform
|
der Reihenfolge abgearbeitet. Dabei wird für jede Resource der für die Plattform
|
||||||
zugehörige Provider ausgewählt. Dieser überprüft den aktuellen Zustand der
|
zugehörige Provider ausgewählt. Dieser überprüft den aktuellen Zustand der
|
||||||
Resource und verändert, wenn notwendig, das System um den Sollzustand zu
|
Resource und verändert wenn notwendig das System um den Sollzustand zu
|
||||||
erreichen. Zum Schluss überträgt Chef-client, die aktualisierten Attributes auf
|
erreichen. Zum Schluss überträgt Chef-client die aktualisierten Attributes auf
|
||||||
den Server, von welchem sie in Solr indexiert werden.
|
den Server, von welchem sie in Solr indexiert werden.
|
||||||
|
|
||||||
Es besteht die Möglichkeit vor oder nach dem Provisioning Handler auszuführen.
|
Es besteht die Möglichkeit vor oder nach dem Provisioning Handler auszuführen.
|
||||||
|
@ -2,21 +2,21 @@
|
|||||||
\label{ssub:einrichtung-der-netzwerkdienste}
|
\label{ssub:einrichtung-der-netzwerkdienste}
|
||||||
|
|
||||||
Für die Provisionierung der Netzwerkdienste wurde
|
Für die Provisionierung der Netzwerkdienste wurde
|
||||||
\href{http://vagrantup.com}{Vagrant} verwendet. Dies ein Programm um auf der
|
\href{http://vagrantup.com}{Vagrant} verwendet. Dies ist ein Programm um auf der
|
||||||
Basis von Virtualbox und anderen Virtualisierungslösungen schnell und
|
Basis von Virtualbox und anderen Virtualisierungslösungen schnell und
|
||||||
reproduzierbar virtuelle Maschinen zu starten. Die Einstellungen hierfür werden
|
reproduzierbar virtuelle Maschinen zu starten. Die Einstellungen hierfür werden
|
||||||
in der Datei \emph{Vagrantfile} geschrieben, welches Vagrant beim Start
|
in der Datei \emph{Vagrantfile} geschrieben, welches Vagrant beim Start
|
||||||
einliest. Vagrant bietet eine gute Integration für Chef. Es bietet Optionen, mit
|
einliest. Vagrant bietet eine gute Integration für Chef. Es bietet Optionen, mit
|
||||||
welchen Einstellungen neue virtuelle Maschinen provisioniert werden sollen. Zum
|
welchen Einstellungen neue virtuelle Maschinen provisioniert werden sollen. Zum
|
||||||
Einsatz kam das Betriebssystem Ubuntu in der Version 12.04. Das Basisimage
|
Einsatz kam das Betriebssystem Ubuntu in der Version 12.04. Das Basisimage
|
||||||
hierfür wurde von \emph{Opscode}, der Firma hinter Chef, bereitgestellt. Es
|
hierfür wurde von \emph{Chef}, der gleichnamigen Firma hinter Chef,
|
||||||
wurde ein Netzwerkinterface konfiguriert für die Kommunikation mit Vagrant und
|
bereitgestellt. Es wurde ein Netzwerkinterface konfiguriert für die
|
||||||
ein weiteres Internes für ein virtuelles Netzwerk zwischen den VMs zum Betreiben
|
Kommunikation mit Vagrant und ein weiteres Internes für ein virtuelles Netzwerk
|
||||||
der Netzwerkdienste. Vagrant bietet für diese erweiterten Einstellungen keine
|
zwischen den VMs zum Betreiben der Netzwerkdienste. Vagrant bietet für diese
|
||||||
Optionen. Um diese dennoch zu übernehmen, waren spezielle
|
erweiterten Einstellungen keine Optionen. Um diese dennoch zu übernehmen, waren
|
||||||
Kommandozeilenargumente an den Befehl \emph{VBoxManage} nötig, welches von
|
spezielle Kommandozeilenargumente an den Befehl \emph{VBoxManage} nötig, welches
|
||||||
Vagrant für Virtualbox genutzt wird. Dies schränkt Nutzung allerdings auf die
|
von Vagrant für Virtualbox genutzt wird. Dies schränkt Nutzung allerdings auf
|
||||||
Visualisierung Virtualbox ein. Vagrant bietet die Möglichkeit neben
|
die Visualisierung Virtualbox ein. Vagrant bietet die Möglichkeit neben
|
||||||
Provisionierungsystemen auch Shellskripte auszuführen. Diese wurde genutzt um
|
Provisionierungsystemen auch Shellskripte auszuführen. Diese wurde genutzt um
|
||||||
Chef auf die zum damaligen Zeitpunkt aktuellste Version 11.8.2 upzudaten.
|
Chef auf die zum damaligen Zeitpunkt aktuellste Version 11.8.2 upzudaten.
|
||||||
|
|
||||||
@ -38,7 +38,7 @@ Zur Verwaltung der externen und internen Cookbooks wurde die
|
|||||||
Abhängigkeitsverwaltung \href{http://berkshelf.com}{Berkshelf} verwendet. Bei
|
Abhängigkeitsverwaltung \href{http://berkshelf.com}{Berkshelf} verwendet. Bei
|
||||||
diesem werden die zu ladenden Cookbooks und die gewünschte Version in einer
|
diesem werden die zu ladenden Cookbooks und die gewünschte Version in einer
|
||||||
Datei namens Berkssfile angegeben (vergleichbar mit
|
Datei namens Berkssfile angegeben (vergleichbar mit
|
||||||
\href{http://bundler.io/}{Gemfile} in Ruby). Berkshelf unterstützt dabei
|
\href{http://bundler.io/}{Gemfiles} in Ruby). Berkshelf unterstützt dabei
|
||||||
verschiedene Quellen (per Api von der Communityseite von Opscode, Git, lokal)
|
verschiedene Quellen (per Api von der Communityseite von Opscode, Git, lokal)
|
||||||
und kann Abhängigkeiten zu anderen Cookbooks auflösen. Um die Cookbooks initial
|
und kann Abhängigkeiten zu anderen Cookbooks auflösen. Um die Cookbooks initial
|
||||||
zu laden muss der Befehl:
|
zu laden muss der Befehl:
|
||||||
@ -49,16 +49,16 @@ im Projektverzeichnis ausgeführt werden.
|
|||||||
|
|
||||||
Für das Zusammenspiel mit Vagrant gibt es das Plugin
|
Für das Zusammenspiel mit Vagrant gibt es das Plugin
|
||||||
\href{https://github.com/berkshelf/vagrant-berkshelf}{vagrant-berkshelf}, so
|
\href{https://github.com/berkshelf/vagrant-berkshelf}{vagrant-berkshelf}, so
|
||||||
dass die von Berkshelf verwalten Cookbooks auch in Vagrant zur Verfügung stehen.
|
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
|
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 zwar in
|
\emph{virtualbox-client-modules} in der VM installiert sein. Diese sind zwar in
|
||||||
vielen Images vorhanden, die es für Vagrant gibt. Allerdings muss die
|
vielen Images, die es für Vagrant gibt, vorhanden. Allerdings muss die
|
||||||
Virtualboxversion des Host mit dem der VM übereinstimmen. Abhilfe schafft das
|
Virtualboxversion des Host mit Dem in der VM übereinstimmen. Abhilfe schafft das
|
||||||
Vagrantplugin
|
Vagrantplugin \href{https://github.com/dotless-de/vagrant-vbguest}{vagrant-vbguest}.
|
||||||
\href{https://github.com/dotless-de/vagrant-vbguest}{vagrant-vbguest}. Dieses
|
Dieses vergleicht beim Start die Versionen und installiert gegeben falls eine
|
||||||
überprüft beim Start die Versionen und installiert gegeben falls eine Andere in
|
Andere in der VM.
|
||||||
der VM.
|
|
||||||
|
|
||||||
Beide Plugins werden diesen Befehlen installiert:
|
Beide Plugins werden diesen Befehlen installiert:
|
||||||
|
|
||||||
@ -70,7 +70,7 @@ Gestartet wird die VM mit dem Befehl:
|
|||||||
|
|
||||||
\shellcmd{vagrant up}
|
\shellcmd{vagrant up}
|
||||||
|
|
||||||
Beim 1. Start wird die VM mit Chef provisioniert. Spätere kann Chef erneut mit
|
Beim 1. Start wird die VM mit Chef provisioniert. Später kann Chef erneut mit
|
||||||
folgenden Befehl gestartet werden:
|
folgenden Befehl gestartet werden:
|
||||||
|
|
||||||
\shellcmd{vagrant provision}
|
\shellcmd{vagrant provision}
|
||||||
@ -90,20 +90,20 @@ mit dem Hostnamen \emph{node0.lctp} und zwei Computenodes (\emph{node1.lctp} und
|
|||||||
Für das Deployment wurden fünf Cookbooks geschrieben:
|
Für das Deployment wurden fünf Cookbooks geschrieben:
|
||||||
\begin{description}
|
\begin{description}
|
||||||
\item[bind]
|
\item[bind]
|
||||||
Als DNS-Server wurde bind gewählt. Dieses Cookbook diesen Dienst ein und
|
Als DNS-Server wurde bind gewählt. Dieses Cookbook richtet diesen Dienst ein
|
||||||
fügt die in den Attributen konfigurierten DNS-Einträge hinzu zu den
|
und fügt die in den Attributen konfigurierten DNS-Einträge hinzu zu den
|
||||||
entsprechenden Zonen hinzu.
|
entsprechenden Zonen hinzu.
|
||||||
\item[dhcp]
|
\item[dhcp]
|
||||||
Dieses Cookbook richtet den ISC DHCP-Server ein. Neben der Zuordnung von
|
Dieses Cookbook richtet den ISC DHCP-Server ein. Neben der Zuordnung von
|
||||||
festen IP-Adressen zu Nodes, kann ein DNS-Server und ein NTP-Server
|
festen IP-Adressen zu Nodes, kann ein DNS-Server und ein NTP-Server
|
||||||
festgelegt werden.
|
festgelegt werden.
|
||||||
\item[lctp-network] Dieses Cookbook ist ein Wrappercoobook um das
|
\item[lctp-network] Dieses Cookbook ist ein Wrappercookbook um das
|
||||||
\href{https://github.com/redguide/network_interfaces}{network\_interfaces}
|
\href{https://github.com/redguide/network_interfaces}{network\_interfaces}
|
||||||
Cookbook. Wrappercookbook werden häufig dazu benutzt um bestehende Cookbooks
|
Cookbook. Wrappercookbooks werden häufig dazu benutzt um bestehende Cookbooks
|
||||||
aus anderen Quellen um Funktionalität zu erweitern. In diesem Fall aktiviert
|
aus anderen Quellen um Funktionalität zu erweitern. In diesem Fall aktiviert
|
||||||
das Cookbook für die Computenodes dhcp auf dem interen Netzwerkinterface.
|
das Cookbook für die Computenodes dhcp auf dem interen Netzwerkinterface.
|
||||||
Auf den Headnodes wird eine statische IPadresse gesetzt, der DNS-Server auf
|
Auf den Headnodes wird eine statische IP-Adresse gesetzt, der DNS-Server auf
|
||||||
localhost festgelegt und Ipforwarding sowie Masquerading via iptables für
|
localhost festgelegt und IP-Forwarding sowie Masquerading via iptables für
|
||||||
den Routerbetrieb aktiviert.
|
den Routerbetrieb aktiviert.
|
||||||
\item[ntp]
|
\item[ntp]
|
||||||
Dieses Cookbook richtet den NTP-Deamon ein, welcher die Zeit zwischen den
|
Dieses Cookbook richtet den NTP-Deamon ein, welcher die Zeit zwischen den
|
||||||
@ -112,7 +112,7 @@ Für das Deployment wurden fünf Cookbooks geschrieben:
|
|||||||
Dieses Cookbook fast alle oben genannten Cookbooks für Compute- und
|
Dieses Cookbook fast alle oben genannten Cookbooks für Compute- und
|
||||||
Headnode zusammen. Man könnte dies prinzipiell auch in den jeweiligen
|
Headnode zusammen. Man könnte dies prinzipiell auch in den jeweiligen
|
||||||
Rollen erledigen. Rollen in Chef haben allerdings den Nachteil, dass diese
|
Rollen erledigen. Rollen in Chef haben allerdings den Nachteil, dass diese
|
||||||
nicht versionierbar sind und (bei Chef-server) über alle Umgebungen gleich
|
nicht versionierbar und (bei Chef-server) über alle Umgebungen gleich
|
||||||
sind. Somit ist eine Trennung zwischen Test- und Produktivumgebung
|
sind. Somit ist eine Trennung zwischen Test- und Produktivumgebung
|
||||||
schwierig.
|
schwierig.
|
||||||
\end{description}
|
\end{description}
|
||||||
|
@ -1,12 +1,11 @@
|
|||||||
\subsubsection{Verifikation}
|
\subsubsection{Verifikation}
|
||||||
\label{ssub:verifikation}
|
\label{ssub:verifikation}
|
||||||
|
|
||||||
Wie auch Software müssen auch Provisionierungsskripte getestet werden.
|
Wie auch Software müssen auch Provisionierungsskripte getestet werden. Dies
|
||||||
Dies gestaltet sich oft als schwierig, weil nicht immer eine Kopie des
|
gestaltet sich oft als schwierig, weil nicht immer eine exakte Kopie des
|
||||||
aktuellen Produktionssystem zur Verfügung steht. Mit steigender Komplexität
|
aktuellen Produktionssystem zur Verfügung steht. Mit steigender Komplexität
|
||||||
steigt der Aufwand geschriebene Cookbooks manuell zu testen. Im Folgenden
|
steigt der Aufwand geschriebene Cookbooks manuell zu testen. Im Folgenden werden
|
||||||
werden verschiedene Möglichkeiten aufgeführt, wie dies automatisiert werden
|
verschiedene Möglichkeiten aufgeführt, wie dies automatisiert werden kann.
|
||||||
kann.
|
|
||||||
|
|
||||||
Die erste und einfachste Methode ist der Befehl:
|
Die erste und einfachste Methode ist der Befehl:
|
||||||
|
|
||||||
@ -15,38 +14,39 @@ Die erste und einfachste Methode ist der Befehl:
|
|||||||
Dieser überprüft den Rubyquellcode und die Templates des Cookbooks auf Syntaxfehler.
|
Dieser überprüft den Rubyquellcode und die Templates des Cookbooks auf Syntaxfehler.
|
||||||
Allerdings treten viele Fehler erst zur Laufzeit auf, insbesonderen da Ruby
|
Allerdings treten viele Fehler erst zur Laufzeit auf, insbesonderen da Ruby
|
||||||
eine dynamische Programmiersprache. Ein anderes Programm ist foodcritic. Dies
|
eine dynamische Programmiersprache. Ein anderes Programm ist foodcritic. Dies
|
||||||
ist eine statische Codeanalyse ähnlich jslint oder perlcritics. Dabei wird der
|
ist eine statische Codeanalyse ähnlich \href{http://www.jslint.com/}{JSlint}
|
||||||
Rubycode gegen Regelsatz getestet, um so schlechten Stil zu erkennen oder
|
oder \href{http://perl-critic.stacka.to/}{Perl::Critic}. Dabei wird der
|
||||||
um Codeingstandards innerhalb eines Projekts einzuhalten. Diesen Regelsatz kann
|
Rubycode gegen einen Regelsatz getestet, um so schlechten Stil zu erkennen oder
|
||||||
man durch eigene Regeln erweitern.
|
um Codingstandards innerhalb eines Projekts einzuhalten. Dieser Regelsatz kann
|
||||||
|
durch eigene Regeln erweitern werden.
|
||||||
|
|
||||||
\textbf{Chefspec}
|
\textbf{Chefspec}
|
||||||
\label{chefspec}
|
\label{chefspec}
|
||||||
|
|
||||||
Chefspec baut auf das in Ruby verbreitete Testframework \emph{Rspec} auf. Rspec
|
Chefspec baut auf das in Ruby verbreitete Testframework
|
||||||
ist ein Testframework, welches auf
|
\href{http://rspec.info/}{RSpec} auf. Rspec ist ein Testframework, welches auf
|
||||||
\href{http://dannorth.net/2012/05/31/bdd-is-like-tdd-if/}{Behavior Driven
|
\href{http://dannorth.net/2012/05/31/bdd-is-like-tdd-if/}{Behavior Driven
|
||||||
Development} (kurz BDD) basiert. Hierbei werden die Testcases in derartiger Form
|
Development} (kurz BDD) basiert. Hierbei werden die Testcases in derartiger Form
|
||||||
auf geschrieben, dass sie sich selbst dokumentieren. Rspec kann aus den
|
auf geschrieben, dass sie sich selbst dokumentieren. RSpec kann aus den
|
||||||
Beschreibungen Sätze bilden und so im Falle eines fehlgeschlagen Tests schnell
|
Beschreibungen Sätze bilden und so im Falle eines fehlgeschlagen Tests schnell
|
||||||
darüber Auskunft zu geben, was der Test getestet hat und wieso dieser
|
darüber Auskunft zu geben, was der Test getestet hat und aus welchen Grund
|
||||||
fehlgeschlagen ist. Chefspec erweitert dabei Rspec um die Möglichkeit Cookbooks
|
dieser fehlgeschlagen ist. Chefspec erweitert dabei RSpec um die Möglichkeit
|
||||||
zu laden und stellt spezielle Matcher (Rspec-Terminologie für Assertions)
|
Cookbooks zu laden und stellt spezielle Matcher (RSpec-Terminologie für
|
||||||
bereit, um diese zu testen.
|
Assertions) bereit, um diese zu testen. Wie bereits in
|
||||||
Wie bereits in Abschnitt~\ref{ablauf_einer_provisionierung} erwähnt, gibt es 2
|
Abschnitt~\ref{ablauf_einer_provisionierung} erwähnt, gibt es 2 Phasen bei der
|
||||||
Phasen bei der Ausführung von Chef. Bei Chefspec wird Provisionierungsprozess
|
Ausführung von Chef. Bei Chefspec wird Provisionierungsprozess nur bis zur
|
||||||
nur bis zur Convergingphase durchlaufen. Die eigenen Tests überprüfen nur die
|
Convergingphase durchlaufen. Die eigenen Tests überprüfen nur die erzeugten
|
||||||
erzeugten Resources. Dies hat den Vorteil, das Tests sehr schnell durchlaufen
|
Resources. Dies hat den Vorteil, das Tests sehr schnell durchlaufen werden, da
|
||||||
werden, da keine Änderungen an einem System vorgenommen werden müssen. Dies hat
|
keine Änderungen an einem System vorgenommen werden müssen. Dies hat Vorteile
|
||||||
Vorteile beim Entwickeln, weil man auf diese Weise schnell Feedback bekommt. Das
|
beim Entwickeln, weil man auf diese Weise schnell Feedback bekommt. Das
|
||||||
Zusammenspiel mehrerer Cookbooks lässt sich dadurch gut testen. Außerdem
|
Zusammenspiel mehrerer Cookbooks lässt sich dadurch gut testen. Außerdem
|
||||||
ermöglicht es verschiedene Konfigurationen/Betriebssysteme durchzutesten, ohne
|
ermöglicht es verschiedene Konfigurationen/Betriebssysteme durchzutesten, ohne
|
||||||
das diese (zeit)aufwendig aufgesetzt werden müssen. Da Chefspec allerdings nicht
|
das diese (zeit)aufwendig aufgesetzt werden müssen. Da Chefspec allerdings zu
|
||||||
wirklich Code auf dem System ausführt, sind weitere Integrationstest
|
keinen Zeitpunkt Code auf dem System ausführt, sind weitere Integrationstest
|
||||||
unerlässlich.
|
unerlässlich.
|
||||||
|
|
||||||
Der folgende Test wurde aus dem NTP-Cookbook
|
Der folgende Test wurde aus dem selbst geschriebenen NTP-Cookbook
|
||||||
(~\ref{ssub:einrichtung-der-netzwerkdienste}) entnommen.
|
(\ref{ssub:einrichtung-der-netzwerkdienste}) entnommen.
|
||||||
|
|
||||||
\begin{lstlisting}[language=Ruby]
|
\begin{lstlisting}[language=Ruby]
|
||||||
require_relative '../spec_helper'
|
require_relative '../spec_helper'
|
||||||
@ -69,7 +69,7 @@ Im \emph{chef\_run}-Block wird der fiktiven Node Attribute zugewiesen und das zu
|
|||||||
testende Cookbook ausgeführt. Das Ergebnis wird in diesem Beispiel in dem Objekt
|
testende Cookbook ausgeführt. Das Ergebnis wird in diesem Beispiel in dem Objekt
|
||||||
\emph{chef\_run} gespeichert. Gegen dieses Objekt wird getestet, ob bestimmte
|
\emph{chef\_run} gespeichert. Gegen dieses Objekt wird getestet, ob bestimmte
|
||||||
Resourcen korrekt initialisiert wurden. In diesem Fall wird überprüft, ob das
|
Resourcen korrekt initialisiert wurden. In diesem Fall wird überprüft, ob das
|
||||||
Packet ntp installiert werden soll und ob das Subnetz in dem Template für
|
Packet "ntp" installiert werden soll und ob das Subnetz in dem Template für
|
||||||
Konfigurationsdatei \emph{/etc/ntp.conf} richtig gesetzt wird.
|
Konfigurationsdatei \emph{/etc/ntp.conf} richtig gesetzt wird.
|
||||||
|
|
||||||
Die Tests werden mit dem Befehl \emph{rspec} ausgeführt. Wenn keine weiteren Argumente
|
Die Tests werden mit dem Befehl \emph{rspec} ausgeführt. Wenn keine weiteren Argumente
|
||||||
@ -77,7 +77,7 @@ angegeben sind, führt dieses Programm alle Dateien unterhalb des Ordners \emph{
|
|||||||
aus, dessen Dateinamen auf \emph{\_spec.rb} enden.
|
aus, dessen Dateinamen auf \emph{\_spec.rb} enden.
|
||||||
|
|
||||||
Um alle drei obgenannten Testmethoden gleichzeitig ausführen zu lassen, wurde
|
Um alle drei obgenannten Testmethoden gleichzeitig ausführen zu lassen, wurde
|
||||||
ein Rakefile geschrieben. \href{http://rake.rubyforge.org/}{Rake} das in Ruby
|
ein Rakefile geschrieben. \href{http://rake.rubyforge.org/}{Rake} ist das in Ruby
|
||||||
geschriebene Äquivalent zu Make, welches ein verbreitetes Buildprogramm auf
|
geschriebene Äquivalent zu Make, welches ein verbreitetes Buildprogramm auf
|
||||||
UNIX-Basierten Plattformen ist. Die Ausführung der Tests geschieht mit dem Befehl:
|
UNIX-Basierten Plattformen ist. Die Ausführung der Tests geschieht mit dem Befehl:
|
||||||
|
|
||||||
@ -96,7 +96,7 @@ schon mit Ruby mitgeliefert wird. Allerdings kann man durch einbinden, der Zeile
|
|||||||
require "minitest/spec"
|
require "minitest/spec"
|
||||||
\end{lstlisting}
|
\end{lstlisting}
|
||||||
|
|
||||||
eine Rspec sehr ähnliche Syntax benutzen. Um Minitest Handler zu nutzen, muss
|
eine RSpec sehr ähnliche Syntax benutzen. Um Minitest Handler zu nutzen, muss
|
||||||
das Recipe aus minitest-handler-cookbook als erstes Recipe in der node geladen
|
das Recipe aus minitest-handler-cookbook als erstes Recipe in der node geladen
|
||||||
werden. Minitest Handler durchsucht beim Durchlauf in jedem anderen cookbook, in
|
werden. Minitest Handler durchsucht beim Durchlauf in jedem anderen cookbook, in
|
||||||
den Unterordnern in \emph{files/} nach dem Verzeichnis \emph{test} und lädt
|
den Unterordnern in \emph{files/} nach dem Verzeichnis \emph{test} und lädt
|
||||||
@ -111,8 +111,8 @@ end
|
|||||||
wird angeben für, welches Recipe der Test gedacht ist (In diesem Fall das
|
wird angeben für, welches Recipe der Test gedacht ist (In diesem Fall das
|
||||||
Defaultrecipe aus dem NTP-Cookbook). Wenn das entsprechende Recipe von der Node
|
Defaultrecipe aus dem NTP-Cookbook). Wenn das entsprechende Recipe von der Node
|
||||||
ausgeführt wird, wird der dazugehörige Test nach dem Provisionierunsdurchlauf
|
ausgeführt wird, wird der dazugehörige Test nach dem Provisionierunsdurchlauf
|
||||||
ebenfalls ausgeführt. Minitest Handler erweitert Rspec um nützliche Methoden um
|
ebenfalls ausgeführt. Minitest Handler erweitert RSpec um nützliche Methoden um
|
||||||
den Status des Systems zu überprüfen. Hier ein Beispiel aus dem bind cookbook,
|
den Status des Systems zu überprüfen. Hier ein Beispiel aus dem Bindcookbook,
|
||||||
welches in Abschnitt~\ref{ssub:einrichtung-der-netzwerkdienste} erwähnt wurde:
|
welches in Abschnitt~\ref{ssub:einrichtung-der-netzwerkdienste} erwähnt wurde:
|
||||||
|
|
||||||
\begin{lstlisting}[language=Ruby]
|
\begin{lstlisting}[language=Ruby]
|
||||||
|
Loading…
Reference in New Issue
Block a user