AWS OpsWorks for Chef Automate, Teil 3 Chef-Cookbooks im Einsatz
Um mit Chef richtig zu arbeiten, müssen wir ein Cookbook mit zugehörigen Rezepten erstellen. In diesem Anwendungsbeispiel werden wir auf einem Linux-Server zur Laufzeit exemplarisch eine neue Webanwendung mit Hilfe eines Chef-Rezepts bootstrappen.
Anbieter zum Thema

Für unser Beispiel ist es zunächst erforderlich, ein einfaches Cookbook zu erstellen. „Kochbücher“ sind unter Chef das grundlegende Einheit zur Konfiguration und Verteilung von Richtlinien mit Chef. Ein Cookbook definiert ein Szenario – oder einen Konfigurationsstatus – und enthält alles, was zur Unterstützung dieses Szenarios erforderlich ist.
Hierzu zählen in erster Linie die einzelnen Chef-Rezepte, aber auch weitere Vorlagen- und Konfigurationsdateien. Technisch betrachtet gleicht das Cookbook einem Ordner mit einer vorgegeben Struktur, die etwa so aussieht.
cookbooks (Ordner)
|--- mycookbook (Ordner)
|--- metadata.rb (Datei)
|--- recipes (Ordner)
|--- default.rb (Datei)
|--- templates (Ordner)
|--- index.html.erb(Datei)
|--- attributes (Ordner)
|--- default.rb (Datei)
Cookbooks müssen in einem Online-Repository gespeichert sein, wahlweise im ZIP-Format oder (besser) in einem S3-Bucket oder einem Quellcode-Repo, in welchen sich Cookbooks auch versionieren lassen. Unterhalb des Ordners mit dem Cookbook-Namen gibt es eine Unterordner-Struktur, die zumindest Dateien der drei Komponenten „Attributes“, „Templates“ und „Recipes“ enthält.
- Die Recipe-Dateien stellen dabei namensgetreu die eigentlichen Rezepte dar. Sie sind in Prinzip Ruby-Anwendungen, die alles definieren, was zum Konfigurieren eines Systems erforderlich ist. Dies umfasst das Erstellen und Konfigurieren von Ordnern, die Installation und Konfiguration von Paketen sowie das Starten von Diensten.
- Attribute Files enthalten eine Reihe von Attributen, die Werte darstellen, die von den Rezepten und Vorlagen verwendet werden können. Attribute-Dateien tragen wie Rezepte die Endung „.rb“.
- Template Files stellen wiederum Rezepte zum Erstellen „anderer“ Dateien dar, z. B. von Konfigurationsdateien. Templates helfen beim Modifizieren von Konfigurationsdateien durch das Überschreiben von Attributen, ohne dass dazu das Cookbook selbst angefasst werden oder eine neue Konfigurationsdatei geschrieben werden muss. Möchte man eine Konfigurationsdatei in einer Instanz auch nur geringfügig ändern, gelingt das am besten mit Hilfe einer Vorlagendatei. Templates tragen die Endung „.erb“
Folgendes Beispiel für ein Rezept dient der Installation von Apache auf einem beliebigen Linux-Node und muss innerhalb des Cookbooks im Subfolder „recipes“ mit einem Dateinamen gespeichert werden, der auf .rb enden.
package 'apache2' do
case node[:platform]
when 'centos','redhat','fedora','amazon'
package_name 'httpd'
when 'debian','ubuntu'
package_name 'apache2'
end
action :install
end
Das Starter-Kit stellt bereits einen Cookbook-Folder zur Verfügung. Hierzu navigiert man auf seiner Chef-Workstation zu ~/[Name-des-Starter-Kit-Verzeichnis]/cookbooks. Das Erstellen eines neuen Cookbooks namens „simple-webapp“ mit passenden (leeren) Skeletons für Attributes, Templates und Recipes erfolgt dann z. B. durch Eingeben von:
chef generate cookbook simple-webapp
Die Ausgabe sollte so aussehen:
enerating cookbook simple-webapp
- Ensuring correct cookbook file content
- Ensuring delivery configuration
- Ensuring correct delivery build cookbook content
Your cookbook is ready. Type cd Simple-webapp to enter
Danach führt man im Verzeichnis des neuen Cookbooks – hier „simple-webapp“ – folgendes Kommando aus, um eine Template-Datei namens „index.html.erb“ zu generieren.
chef generate template index.html.erb
Die Template-Datei muss nun mit Hilfe eines Editors mit Inhalt gefüllt werden, etwa so:
<HTML>
<TITLE>Beispiel für Artikel OpsWorks for Chef Automate zum Bereitstellen von Apache auf - <%= node['Simple-webapp']['appname'] %></TITLE>
<BODY bgcolor=<%= node['Simple-webapp']['bgcolor'] %>>
<H2 align=center>Welcome to OpsWorks , <%=
node['Simple-webapp']['myname'] %></H1>
<TABLE border="1" align=center>
<TR><TD colspan=2>OpsWorks Flavors</TD></TR>
</TABLE>
<center>
<a href=newfriends.php>click here</a> to record a new contact!
</center>
</BODY>
<style type="text/css">
#footer {
bottom : 2;
height : 40px;
margin-top : 40px;
text-align: center;
vertical-align: middle;
}
</style>
<div id="footer">Web server instance ID: <%= node['hostname'] %></div>
</HTML>
Nun generieren wir wie folgt auch noch eine passende Attributdatei. Dieser Befehl generiert eine neue Attributdatei mit dem Namen „default“.
chef generate attribute default.rb
Diese „befüllen“ wir dann wie folgt:
default ['simple-webapp'] ['appname'] = 'Simple WebApp'
default ['simple-webapp'] ['meinname'] = 'Vorname Nachname'
default['simple-webapp']['bgcolor'] = ' DF7401 '
Jetzt ist es an der Zeit, das noch leere Standard-Rezept anzupassen, wozu wir die Datei „recipes/default.rb mit im Editor der Wahl bearbeiten. Hier hinein kommt jetzt in Ruby-Syntax der Code hinzu, um Apache zu installieren und die Datei /var/www/html/index.html aus der oben erstellten Vorlage zu erzeugen:
package 'httpd' do
case node['platform']
when 'centos','redhat','amazon'
package_name 'httpd'
when 'debian','ubuntu'
package_name 'apache2'
end
action :install
end
service 'httpd' do
action [:enable, :start]
end
template '/var/www/html/index.html' do
source 'index.html.erb'
owner 'root'
group 'apache'
mode '0755'
end
Anschließend erweitern wir unser Cookbook dahingehend, das Standard-Cookbook für den „chef-client“ zu verpacken. Ein gängiger Trick dazu ist das Schreiben eines sogenannten Wrapper-Cookbooks. Hierbei handelt es sich um ein Standard-Cookbook, das von anderen Cookbooks und Rezepten abhängt, bzw. darauf verweist.
Auf diese Weise lassen sich vorhandene Rezepte aus dem Chef-Supermarket, z. B. für den „chef-client“, einfach zugänglich machen. Ansatzpunkt dazu ist das Bearbeiten der Datei „metadata.rb“ im Hauptverzeichnis des jeweiligen Cookbooks. Dieses ergänzen wir um die Zeile …
depends 'chef-client'
Danach ändern wir noch das Standardabfrageintervall für den Chef-Client von 30 Minuten auf fünf Minuten (300 Sekunden), wozu wir die attributes.rb-Datei um folgende Zeile ergänzen:
default['chef-client']['interval'] = '300'
default['chef-client']['splay'] = '0'
„Splay“ ist eine Funktion, die dem Abfrageintervall eine zufällige Anzahl von Sekunden (standardmäßig zwischen 1 und 300) hinzufügt. Durch das Reduzieren auf Null stellen wir sicher, dass der Chef-Client alle fünf Minuten nach Änderungen abfragt. Jetzt müssen wir nur noch unserer Standard-Rezept für die simple-webapp um den Eintrag
include_recipe 'chef-client::default'
erweitern, um den Chef-Client beim Bootstrapping von simple-webapp gleich mit zu installieren.
Rezepte hochladen und anwenden
Zum Hochladen, bzw. Synchronisieren unserer auf der Chef-Workstation verfassten Rezepte installieren wir zunächst ein weiteres Tool namens berkshelf – ein Abhängigkeitsmanager für Chef-Cookbooks. Mit Hilfe von Berkshelf können sich Nutzer ganz einfach auf Community-Cookbooks verlassen und diese sicher in ihren Workflow aufnehmen.
Mit Berkshelf lässt sich auch sicherstellen, dass die jeweiligen CI-Systeme reproduzierbar die gleichen Cookbook-Versionen auswählen und Abhängigkeiten hochladen oder bündeln, ohne dass eine lokal verwaltete Kopie erforderlich ist. Berkshelf ist im Chef Development Kit enthalten. Wurde das Chef-Developement-Kit „ChefDK“ erfolgreich installiert, lässt sich Berkshelf wie folgt bereitstellen:
berks install
Die muss im Haupt-Verzeichnis des jeweiligen Cookbooks passieren, indem auch das Berksfile liegt. Die Ausgabe sollte so aussehen:
Resolving cookbook dependencies...
Fetching 'simple-webapp' from source at .
Fetching cookbook index from https://supermarket.chef.io...
Installing compat_resource (12.19.0)
Installing chef-client (8.1.7)
Installing cron (4.1.3)
Installing logrotate (2.2.0)
Installing ohai (5.1.0)
Using simple_webapp (0.1.1) from source at .
Nun können wir Berkshelf verwenden, um das neue Cookbook samt seiner Abhängigkeiten wie folgt auf den Chef-Server hochzuladen.
berks upload
Anschließend listen wir mit dem knife-Befehl alle Cookbooks auf dem Chef-Server auf.
knife cookbook list
Die Ausgabe sieht in etwa folgendermaßen aus:
chef-client 8.1.7
compat_resource 12.19.0
cron 4.1.3
logrotate 2.2.0
ohai 5.1.0
simple-webapp 0.1.1
windows 3.1.1
Jetzt sind wir in der Lage, mit folgenden Kommando die Chef-Client-Tools auf dem vorhandenen Webserver zu installieren und das Standardrezept (simple-webapp) anzuwenden.
knife bootstrap [WebServer-PrivateIp] -N [EC2InstanceID] --ssh-user ec2-user --sudo --identity-file ~/.ssh/[KeyName].pem --run-list 'recipe[simple_webapp],recipe[chef-client]'
Hierbei ist [WebServer-PrivateIp] die private IP-Adresse des laufenden, hier EC2-basierten Webservers, [EC2InstanceID] seine Instanz-ID und [KeyName] der Namen des Schlüsselpaars für den SSH-Zugriff auf den Webserver. Um die aktualisierte bzw. hierdurch initial erstellte Website zu testen, kann man die URL des Servers aufrufen.
(ID:45619831)