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
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.
Themen
Definieren und Starten eines Service
In diesem Abschnitt werden die Grundlagen zum Definieren und Starten eines Service erläutert.
Dies sind Ihre ersten Schritte
-
Erstellen Sie ein Verzeichnis im Verzeichnis
opsworks_cookbooksnamenstomcatund öffnen Sie es. -
Fügen Sie eine Datei
metadata.rbzutomcatmit dem folgenden Inhalt hinzu:name "tomcat" version "0.1.0" -
Initialisieren und konfigurieren Sie Test Kitchen wie unter Beispiel 1: Installieren von Paketen beschrieben und entfernen Sie CentOS aus der Liste
platforms. -
Fügen Sie ein Unterverzeichnis
recipeszutomcathinzu.
Verwenden Sie eine service
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ührtapt-get updateaus, 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
tomcatwird von anderen Rezepten als Referenz auf den Service verwendet.Beispielsweise wird
default.rbvontomcatfü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.
-
supportsgibt an, wie Chef die Befehlerestart,reloadundstatusdes Service verwaltet.-
Der Wert
truegibt an, dass Chef das "init"-Skript oder einen anderen Serviceanbieter zum Ausführen des Befehls verwenden kann. -
falsegibt 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
-
Erstellen Sie die Datei
default.rb, die das Standardrezeptbeispiel enthält, und speichern Sie diese inrecipes. -
Erstellen Sie die Datei
service.rb, die das Servicedefinitionsbeispiel enthält, und speichern Sie diese inrecipes. -
Führen Sie
kitchen convergeaus, 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
-
Fügen Sie ein Unterverzeichnis
templateszutomcatund ein Unterverzeichnisdefaultzutemplateshinzu. -
Kopieren Sie die Vorlage
example_data.json.erbaus dem Rezeptbuchcreatefilein das Verzeichnistemplates/default. -
Fügen Sie ein Unterverzeichnis
attributeszutomcathinzu. -
Kopieren Sie die Attributdatei
default.rbaus dem Rezeptbuchcreatefilein das Verzeichnisattributes.
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
notifieseingebunden, sodass der Tomcat-Service bei einer Änderung der Dateiexample_data.jsonneu 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
-
Führen Sie
kitchen destroyaus, damit Sie mit einer neuen Instance beginnen können. -
Ersetzen Sie den Code in
default.rbdurch das vorherige Beispiel. -
Führen Sie
kitchen convergeaus 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.