So verwalten Sie Ihren Cluster mit Chef und Knife unter Ubuntu

Einführung

Chef ist ein Konfigurationsmanagementsystem - es wurde entwickelt, um Ihnen eine wiederholbare Reihe von Rezepten für den Aufbau Ihrer Infrastruktur zu bieten, mit denen Sie Ihre Infrastruktur weitgehend wie Ihren Anwendungscode automatisieren, versionieren und testen können.

Dies ist das sechste Lernprogramm in der Reihe Getting Started Managing Your Infrastructure Using Chef. In diesem Handbuch wird davon ausgegangen, dass Sie die anderen fünf Lernprogramme abgeschlossen haben und somit einen Chef-Server, eine Workstation und einen oder mehrere Knoten eingerichtet haben.

Unser Ziel

  • knife * ist ein Kommandozeilen-Tool, das im Lieferumfang von Chef enthalten ist. Sie haben wahrscheinlich bereits Messer zum Erstellen und Verwalten von Kochbüchern, Datentaschen oder Rollen verwendet. Wenn Sie einen Befehl mit knife ausgeben, geben Sie normalerweise Folgendes ein:

knife cookbook create

Der obige Beispielbefehl verwendet den Unterbefehl + cookbook + knife. Diese Anleitung führt Sie in einige neue Messer-Unterbefehle ein, mit denen Sie Befehle erteilen und Informationen zu Ihrem Chef-Cluster abrufen können.

Wir decken ab:

  • + Messerstatus

  • + Messer ssh +

  • + Messerknoten +

Voraussetzungen

In diesem Tutorial wird davon ausgegangen, dass Sie bis zum fünften Leitfaden (https://www.digitalocean.com/community/tutorials/how-to-use-the-digitalocean-plugin-for-knife-to-manage-droplets-in) gefolgt sind -chef [Verwenden des DigitalOcean-Plugins für Knife zum Verwalten von Tröpfchen in Chef] unter Getting Started Verwalten Ihrer Infrastruktur mit Chef.

Erstellen Sie Beispielrollen und Server

Wenn Sie keinen etablierten Chef-Cluster haben oder diesen Leitfaden genau befolgen und dieselbe Ausgabe sehen möchten, können wir einige Beispielrollen und Server einrichten.

Wechseln Sie zunächst auf Ihrer * Workstation * in das Verzeichnis + chef-repo +:

cd ~/chef-repo

Wir werden eine * Backend * -Rolle zu unserer bestehenden * web_server * -Rolle hinzufügen. Im Moment ist es leer, aber Sie können es später in eine Datenbank oder einen Anwendungsserver verwandeln.

nano roles/backend.rb

Fügen Sie diesen Inhalt zur Datei "+ backend.rb +" hinzu:

name "backend"
description "Backend for application servers"

Laden Sie dann die neue Rolle auf Ihren Chef-Server hoch.

knife role from file roles/backend.rb

Anschließend können Sie mit dem DigitalOcean Knife-Plugin einige Beispielknoten erstellen.

(Hinweis: Dieses Plugin wurde ab Oktober 2014 nicht mehr verwaltet. Es liegt an Ihnen, ob Sie es verwenden möchten.)

knife digital_ocean droplet create --server-name frontend01 --image 6918990 --location 4 --size 63 --ssh-keys 22222 --bootstrap --run-list "role[web_server]"

knife digital_ocean droplet create --server-name frontend02 --image 6918990 --location 4 --size 63 --ssh-keys 22222 --bootstrap --run-list "role[web_server]"

knife digital_ocean droplet create --server-name backend01 --image 6918990 --location 4 --size 63 --ssh-keys 22222 --bootstrap --run-list "role[backend]"

knife digital_ocean droplet create --server-name backend02 --image 6918990 --location 4 --size 63 --ssh-keys 22222 --bootstrap --run-list "role[backend]"

Hinweis: Wenn sich Ihre Domain-Namen für die verschiedenen Hosts in Ihrem Chef-Cluster nicht extern auflösen lassen und Sie sie über bearbeitete "+ / etc / hosts " - Dateien miteinander verbinden, funktioniert die Bereitstellung nicht wie die neue Die Serverinstanz erhält die Standarddatei " / etc / hosts +".

Möglicherweise sind noch einige Knoten aktiv, die Sie während der Chef-Tutorialserie erstellt haben. Das bedeutet, dass einige der Befehle, die wir in diesem Lernprogramm ausführen, zusätzliche Zeilen oder Informationen enthalten. Wenn Sie genau mitverfolgen möchten, können Sie diese Knoten jederzeit entfernen, indem Sie auf der Weboberfläche Ihres Chef-Servers auf "Knoten> Löschen" klicken.

Status mit Messerstatus anzeigen

Der Unterbefehl + status + dient zum Anzeigen von Statusinformationen zu Ihren Knoten. Um "+ knife status " zu verwenden, wechseln Sie einfach in Ihr " chef-repo +" -Verzeichnis und geben Sie Folgendes ein:

knife status

Sie sehen eine Liste der Knoten, die Ihrem Chef-Server bekannt sind, einschließlich der Zeiten der letzten "+ chef-client +" -Läufe, Knotennamen, vollqualifizierten Domainnamen, IP-Adressen und Plattformen.

3 minutes ago, frontend01, fe1.yourdomain.com, 111.111.111.111, ubuntu 14.04.
3 minutes ago, frontend02, fe2.yourdomain.com, 222.222.222.222, ubuntu 14.04.
20 hours ago,  backend01, be1.yourdomain.com, 333.333.333.333, ubuntu 14.04.
3 minutes ago, backend02, be2.youdomain.com, 333.333.333.333, ubuntu 14.04.

Wir können sofort erkennen, dass wir uns * backend01 * genauer ansehen müssen - es hat in etwa 20 Stunden nicht erfolgreich "+ chef-client +" ("eingecheckt" in "chef parlance") ausgeführt.

Wenn Sie einen Knoten in einer ähnlichen Situation haben, überprüfen Sie Ihre "+ chef-client +" - Fehlerprotokolle oder verwenden Sie "Berichte> Verlauf ausführen" auf der Weboberfläche des Chef-Servers.

Befehle mit Messer ssh ausgeben

Wir können "+ knife ssh " verwenden, um Befehle auf einmal an unsere Knoten (oder eine Teilmenge von Knoten) zu senden. Zum Beispiel können wir ` knife ssh +` verwenden, um Nginx auf allen unseren Knoten mit der Rolle * frontend * neu zu starten.

Sie benötigen einen SSH-berechtigten Benutzer für den Server (d. H. Sie können "+ ssh yourusername @ fe1.yourdomain.com " ausführen und eine Shell erhalten). Wenn Sie keine SSH-Schlüssel eingerichtet haben, können Sie die Option " -P +" verwenden, um zur Eingabe eines Kennworts aufzufordern.

knife ssh "role:web_server" "service nginx restart" -x  -a

Sie sollten eine Ausgabe erhalten, die wie folgt aussieht:

111.111.111.111  * Restarting nginx nginx      [ OK ]
222.222.222.222  * Restarting nginx nginx      [ OK ]

Wir haben gerade einen Befehl auf allen unseren * Frontend * -Servern ausgeführt, indem wir einen einzelnen Messerbefehl ausgegeben haben. Lassen Sie uns die Argumente auseinander ziehen und etwas mehr über die Funktionsweise von "+ knife ssh +" lernen.

knife ssh "web_server" "service nginx restart" -x  -a

Das erste Argument für "+ knife ssh " ist eine Chef-Suchabfrage - normalerweise möchten Sie etwas wie " role: YOUR_ROLE_NAME +", aber Sie können auch über viele andere Attribute suchen (und diese mit Booleschen Operatoren kombinieren). Wenn Sie beispielsweise einen Befehl nur für Knoten ausführen möchten, deren * platform * -Attribut * ubuntu * enthält, können Sie Folgendes ausführen:

knife ssh "platform:ubuntu*" "service nginx restart" -x  -a

Das * oben ist ein Platzhalterzeichen. Es werden null oder mehr Zeichen im Attributwert gefunden. In diesem Fall können wir den Wert * ubuntu 14.04 * wie in der zuvor betrachteten Ausgabe + knife status + anzeigen.

knife ssh "role:web_server" "service nginx restart" -x  -a

Das zweite Argument für "+ knife ssh +" ist der Befehl, den Sie auf den Servern ausführen möchten (die der Suchabfrage entsprechen). Es kann fast alles sein, was Sie in eine Shell eingeben würden. Sie können Befehle sogar mit einem Semikolon (*; *) verbinden.

knife ssh "role:web_server" "uptime;date" -x  -a

Welches würde so etwas ausgeben:

111.111.111.111  12:53:36 up 2 days, 15:25,  1 user,  load average: 0.08, 0.03, 0.05
111.111.111.111 Wed Oct 22 12:53:36 UTC 2014
222.222.222.222  12:53:30 up 2 days, 15:21,  1 user,  load average: 0.00, 0.01, 0.05
222.222.222.222 Wed Oct 22 12:53:30 UTC 2014

Das bereits erwähnte Argument "+ -x +" ist der SSH-Benutzername für die Anmeldung.

Das Argument "+ -a " gibt an, welches Knotenattribut als Adresse für SSH verwendet werden soll. Standardmäßig ist dies der FQDN Ihres Knotens (denken Sie daran, dass Sie diesen mit dem oben gezeigten Befehl " knife status " finden). Wenn Sie also Ihre Server auflösen können, besuchen Sie * http: //fe1.yourdomain.com* Sie können die Option " -a +" weglassen.

Interaktives Messer ssh

+ knife ssh + hat auch die Möglichkeit, Sie in eine interaktive Shell zu versetzen, in der Sie eine Reihe von Befehlen eingeben und die Ergebnisse sehr schnell sehen können. Sie können eine interaktive "+ knife ssh " - Shell starten, indem Sie " interactive +" anstelle Ihres SSH-Befehls verwenden.

knife ssh "role:web_server" interactive -x  -a

Dies wird uns zeigen:

Connected to 111.111.111.111 and 222.222.222.222

To run a command on a list of servers, do:
 on SERVER1 SERVER2 SERVER3; COMMAND
 Example: on latte foamy; echo foobar

To exit interactive mode, use 'quit!'

knife-ssh>

Sie können Befehle an alle Server in Ihrem Suchergebnis senden, indem Sie einfach den Befehl eingeben und die Eingabetaste drücken.

knife-ssh> uptime
111.111.111.111  18:43:55 up 2 days, 21:16,  1 user,  load average: 0.01, 0.03, 0.05
222.222.222.222  18:43:49 up 2 days, 21:11,  1 user,  load average: 0.00, 0.01, 0.05

Wenn Sie Ihre Serverliste weiter verfeinern möchten, verwenden Sie einfach "+ on ", wie in der Hilfemeldung angegeben. Beachten Sie, dass Sie ** SERVER1 ** im Beispielbefehl durch das Attribut ersetzen sollten, das Sie als " -a +" verwendet haben. Für uns ist dies die IP-Adresse des Knotens.

knife-ssh> on 111.111.111.111; echo hello digitalocean
111.111.111.111 hello digitalocean

Eine wirklich coole Verwendung von interaktivem "+ knife ssh " ist das Tailen von Server-Logs. Wenn sich Ihr Zugriffsprotokoll für Nginx beispielsweise am Standardspeicherort befindet (` / var / log / nginx / access.log `), können Sie die Protokolle mit der Option ` -f +` (follow) und den Ergebnissen abschließen wird fortlaufend auf Ihrer Konsole gedruckt.

knife-ssh> tail -f /var/log/nginx/access.log

(Abhängig davon, wie Nginx eingerichtet ist, müssen Sie möglicherweise "+ sudo +" vor diesem Befehl verwenden.)

Wenn Sie die IP-Adresse eines Ihrer Knoten in einem Webbrowser aufrufen, wird im Nginx-Zugriffsprotokoll ein Eintrag angezeigt, ohne dass Sie etwas tun müssen!

Knoten mit dem Messerknoten verwalten

Wenn Sie den How To Create Simple Chef Cookbooks to Manage gefolgt sind Infrastructure on Ubuntu, dann haben Sie bereits "+ knife node +" verwendet, um alle Knoten auf Ihrem Chef-Server aufzulisten und Knotenattribute zu bearbeiten.

knife node list
knife node edit frontend01

Sie können auch + Messerknoten + verwenden, um Knoten zu löschen.

knife node delete frontend01

Oder zeigen Sie detailliertere Knotenattribute an:

knife node show frontend01
*******
Node Name:   frontend01
Environment: _default
FQDN:        fe01.yourdomain.com
IP:          111.111.111.111
Run List:    role[frontend]
Roles:       web_server
Recipes:     apt, nginx, apt::default, nginx::default
Platform:    ubuntu 14.04
Tags:

Mit der Option "+ -l +" erhalten Sie eine vollständige Liste der Attribute Ihres Knotens:

knife node show -l frontend01

Dies gibt eine sehr lange Liste von Attributen zurück, von denen die meisten automatisch von * Ohai * ausgefüllt werden. Hierbei handelt es sich um ein Chef-Tool, das Attribute bei jeder Ausführung automatisch an + chef-client + übergibt.

Eine lange gedruckte Liste von Attributen ist für uns nicht unbedingt sehr nützlich. Aber Messer hat uns auch dort abgedeckt. Wir können die Option "+ - Format +" angeben, um eine JSON- oder YAML-Darstellung der Attribute eines Knotens zu erhalten.

knife node show frontend01 --format json
*******

{
 "name": "frontend01",
 "chef_environment": "_default",
 "run_list": [
 "role[web_server]"
]
,
 "normal": {
   "tags": [

   ]
 }
}

Sie können auch ein einzelnes Knotenattribut mit + -a + abrufen.

knife node show frontend01 --format json -a ipaddress
*******
{
 "frontend01": {
   "ipaddress": "111.111.111.111"
 }
}

Die JSON- oder YAML-Ausgabe kann sehr nützlich sein, wenn wir komplexere Skripten erstellen möchten, die sich auf Messer beziehen, oder sogar zum Anzeigen von Dashboards und Metriken.

Fazit

knife ist ein leistungsstarkes Tool, mit dem Sie nicht nur die verschiedenen Objekte in Ihrem Chef-Cluster erstellen und aktualisieren, sondern auch den Status Ihres Clusters anzeigen und verwalten können.

Mit + knife ssh + können Sie einen Befehl schreiben und auf vielen Knoten gleichzeitig ausführen - ein sehr mächtiges Werkzeug für jeden Entwickler.