Beispiel 8: Verwalten von Services - AWS OpsWorks

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Beispiel 8: Verwalten von Services

Wichtig

Der AWS OpsWorks Stacks Service hat am 26. Mai 2024 das Ende seiner Lebensdauer erreicht und wurde sowohl für neue als auch für bestehende Kunden deaktiviert. Wir empfehlen Kunden dringend, ihre Workloads so bald wie möglich auf andere Lösungen zu migrieren. Wenn Sie Fragen zur Migration haben, wenden Sie sich an das AWS -Support Team auf AWS re:POST oder über den AWS Premium-Support.

Paketen wie z. B. Anwendungsservern ist in der Regel ein Service zugeordnet, der gestartet, gestoppt, neu gestartet usw. werden muss. Beispielsweise müssen Sie den Tomcat-Service nach der Paketinstallation und nach beendetem Instance-Start starten sowie nach jeder Änderung der Konfigurationsdatei neu starten. In diesem Thema werden die Grundlagen für die Verwaltung eines Service auf einer Linux-Instance am Beispiel eines Tomcat-Anwendungsservers dargelegt. Die "service"-Ressource funktioniert auf Windows-Instances auf dieselbe Weise, allerdings gibt es ein paar kleine Unterschiede. Weitere Informationen finden Sie unter service.

Anmerkung

Im Beispiel wird eine sehr minimale Tomcat-Installation ausgeführt. Sie reicht aus, um die Grundlagen für die Verwendung einer service-Ressource zu veranschaulichen. Ein Beispiel für die Rezeptimplementierung auf einem Tomcat-Server mit mehr Funktionen finden Sie unter Erstellen eines benutzerdefinierten Tomcat-Server-Layers.

Definieren und Starten eines Service

In diesem Abschnitt werden die Grundlagen zum Definieren und Starten eines Service erläutert.

Dies sind Ihre ersten Schritte
  1. Erstellen Sie ein Verzeichnis im Verzeichnis opsworks_cookbooks namens tomcat und öffnen Sie es.

  2. Fügen Sie eine Datei metadata.rb zu tomcat mit dem folgenden Inhalt hinzu:

    name "tomcat" version "0.1.0"
  3. Initialisieren und konfigurieren Sie Test Kitchen wie unter Beispiel 1: Installieren von Paketen beschrieben und entfernen Sie CentOS aus der Liste platforms.

  4. Fügen Sie ein Unterverzeichnis recipes zu tomcat hinzu.

Verwenden Sie eine service-Ressource für die Serviceverwaltung. Mit dem folgenden Standardrezept wird Tomcat installiert und der Service gestartet.

execute "install_updates" do command "apt-get update" end package "tomcat7" do action :install end include_recipe 'tomcat::service' service 'tomcat' do action :start end

Vom Rezept werden folgende Schritte ausgeführt:

  • Die execute-Ressource führt apt-get update aus, um aktuelle Systemupdates zu installieren.

    Für die in diesem Beispiel verwendete Ubuntu-Instanz müssen Sie die Updates installieren, bevor Sie Tomcat installieren. Bei anderen Systemen können die Anforderungen abweichen.

  • Die package-Ressource installiert Tomcat 7.

  • Das enthaltene tomcat::service-Rezept definiert den Service (wird später erläutert).

  • Die service-Ressource startet den Tomcat-Service.

    Mit dieser Ressource können Sie auch andere Befehle ausgeben, z. B. den Service stoppen und neu starten.

Im folgenden Beispiel finden Sie das tomcat::service-Rezept.

service 'tomcat' do service_name "tomcat7" supports :restart => true, :reload => false, :status => true action :nothing end

Mit diesem Rezept wird die Tomcat-Servicedefinition wie folgt erstellt:

  • Der Ressourcenname tomcat wird von anderen Rezepten als Referenz auf den Service verwendet.

    Beispielsweise wird default.rb von tomcat für den Servicestart referenziert.

  • Die service_name-Ressource gibt den Servicenamen an.

    Wenn Sie die Services auf der Instance auflisten, wird der Tomcat-Service mit dem Namen "tomcat7" angegeben.

  • supports gibt an, wie Chef die Befehle restart, reload und status des Service verwaltet.

    • Der Wert true gibt an, dass Chef das "init"-Skript oder einen anderen Serviceanbieter zum Ausführen des Befehls verwenden kann.

    • false gibt an, dass Chef versuchen muss, den Befehl anderweitig auszuführen.

Beachten Sie, dass action auf :nothing festgelegt ist. Damit wird die Ressource angewiesen, keine Aktion auszuführen. Die "service"-Ressource unterstützt Aktionen wie start und restart. Dieses Rezeptbuch folgt jedoch der Standardvorgehensweise und verwendet eine Servicedefinition, bei der keine Aktion erfolgt. Der Service wird anderweitig gestartet bzw. neu gestartet. Jedes Rezept, über das ein Service gestartet oder neu gestartet wird, muss diesen zunächst definieren. Die einfachste Methode ist daher, die Servicedefinition in einem separaten Rezept zu speichern und dieses bei Bedarf in andere Rezepte einzubinden.

Anmerkung

Der Einfachheit halber wird im Standardrezept dieses Beispiels eine service-Ressource verwendet, um den Service nach Ausführung der Servicedefinition zu starten. In einer Produktionsimplementierung wird ein Service in der Regel mit notifies gestartet oder neu gestartet (wird später erläutert).

So führen Sie das Rezept aus
  1. Erstellen Sie die Datei default.rb, die das Standardrezeptbeispiel enthält, und speichern Sie diese in recipes.

  2. Erstellen Sie die Datei service.rb, die das Servicedefinitionsbeispiel enthält, und speichern Sie diese in recipes.

  3. Führen Sie kitchen converge aus, melden Sie sich anschließend an der Instance an und führen Sie den folgenden Befehl aus, um zu prüfen, ob der Service ausgeführt wird.

    sudo service tomcat7 status
Anmerkung

Falls Sie service.rb getrennt von default.rb ausführen möchten, müssen Sie .kitchen.yml ändern und tomcat::service zur Ausführungsliste hinzufügen. Wenn Sie ein Rezept einbinden, wird dessen Code vor der Rezeptausführung jedoch in das übergeordnete Rezept übernommen. Daher ist service.rb im Grunde genommen ein Teil von default.rb und erfordert keinen eigenen Eintrag in der Ausführungsliste.

Verwenden von "notifies" für den Start oder Neustart eines Service

In einer Produktionsimplementierung wird ein Service in der Regel nicht mit service gestartet oder neu gestartet. Stattdessen wird notifies zu verschiedenen Ressourcen hinzugefügt. Wenn Sie beispielsweise den Service nach einer Änderung der Konfigurationsdatei neu starten möchten, binden Sie notifies in die zugehörige template-Ressource ein. Die Verwendung von notifies bietet im Vergleich zur service-Ressource für den expliziten Neustart des Service die folgenden Vorteile.

  • Das notifies-Element startet den Service nur dann neu, wenn die zugehörige Konfigurationsdatei geändert wurde. Das Risiko eines unnötigen Serviceneustarts fällt damit weg.

  • Chef startet den Service höchstens einmal am Ende jeder Ausführung neu, unabhängig von der notifies-Anzahl pro Ausführung.

    Beispielsweise können in der Chef-Ausführung mehrere "template"-Ressourcen enthalten sein, von denen jede eine andere Konfigurationsdatei ändert und nach der Dateiänderung einen Neustart des Service erfordert. Sie möchten aber in der Regel den Service nur einmal neu starten, und zwar am Ende der Chef-Ausführung. Andernfalls wird möglicherweise ein Service neu gestartet, der nach dem vorherigen Neustart noch nicht wieder betriebsbereit ist, und das könnte zu Fehlern führen.

In diesem Beispiel wird tomcat::default angepasst, um eine template-Ressource einzubinden, die den Service mithilfe von notifies neu startet. Für ein realistisches Beispiel würden Sie eine "template"-Ressource nutzen, die eine benutzerdefinierte Version von einer Tomcat-Konfigurationsdatei erstellt, aber diese sind meist sehr lang und komplex. Der Einfachheit halber wird in diesem Beispiel die "template"-Ressource aus Erstellen einer Datei mithilfe einer Vorlage verwendet. Sie hat keinerlei Verbindung zu Tomcat, bietet aber eine einfache Möglichkeit, die Verwendung von notifies darzustellen. Ein Beispiel für die Vorlagenverwendung beim Erstellen von Tomcat-Konfigurationsdateien finden Sie unter Einrichtungsrezepte.

So richten Sie das Rezeptbuch ein
  1. Fügen Sie ein Unterverzeichnis templates zu tomcat und ein Unterverzeichnis default zu templates hinzu.

  2. Kopieren Sie die Vorlage example_data.json.erb aus dem Rezeptbuch createfile in das Verzeichnis templates/default.

  3. Fügen Sie ein Unterverzeichnis attributes zu tomcat hinzu.

  4. Kopieren Sie die Attributdatei default.rb aus dem Rezeptbuch createfile in das Verzeichnis attributes.

Im folgenden Rezept wird notifies für den Neustart des Tomcat-Service verwendet.

execute "install_updates" do command "apt-get update" end package "tomcat7" do action :install end include_recipe 'tomcat::service' service 'tomcat' do action :enable end directory "/srv/www/shared" do mode 0755 owner 'root' group 'root' recursive true action :create end template "/srv/www/shared/example_data.json" do source "example_data.json.erb" mode 0644 variables( :a_boolean_var => true, :a_string_var => "some string" ) only_if {node['createfile']['install_file']} notifies :restart, resources(:service => 'tomcat') end

Im Beispiel wird das Rezept aus Erstellen einer Datei mithilfe einer Vorlage mit dem Rezept aus dem vorherigen Abschnitt zusammengeführt. Dabei gibt es zwei wichtige Änderungen:

  • Die service-Ressource ist nach wie vor vorhanden, erfüllt aber nun einen anderen Zweck.

    Die :enable-Aktion aktiviert den Tomcat-Service beim Start.

  • In die "template"-Ressource ist notifies eingebunden, sodass der Tomcat-Service bei einer Änderung der Datei example_data.json neu gestartet wird.

    Auf diese Weise wird sichergestellt, dass der Service bei der Tomcat-Installation gestartet und nach jeder Konfigurationsänderung neu gestartet wird.

So führen Sie das Rezept aus
  1. Führen Sie kitchen destroy aus, damit Sie mit einer neuen Instance beginnen können.

  2. Ersetzen Sie den Code in default.rb durch das vorherige Beispiel.

  3. Führen Sie kitchen converge aus und melden Sie sich anschließend an der Instance an, um zu prüfen, ob der Service ausgeführt wird.

Anmerkung

Wenn Sie einen Service neu starten möchten, aber das Rezept keine Ressource wie z. B. template enthält, die notifies unterstützt, können Sie stattdessen eine execute-Dummy-Ressource nutzen. Beispiel

execute 'trigger tomcat service restart' do command 'bin/true' notifies :restart, resources(:service => 'tomcat') end

Die execute-Ressource muss ein command-Attribut aufweisen, auch wenn Sie die Ressource nur zur Ausführung von notifies einsetzen. In diesem Beispiel wird diese Anforderung durch die Ausführung von /bin/true umgangen. Dieser Shell-Befehl gibt einfach einen Erfolgscode zurück.