2014-12-24 4 views
5

Ich muss einige Aktionen durchführen (etwas konfigurieren), nachdem ich den Tomcat-Dienst beendet habe. Sobald die Konfiguration abgeschlossen ist, muss ich sicherstellen, dass der Tomcat-Dienst wieder betriebsbereit ist. Ich habe folgende Puppen Code für das gleiche geschrieben:In Marionette, wie man einen Service stoppt, etwas Aktion durchführt und dann den Service startet?

Service {'tomcat': ensure => stopped } 
-> 
class {'config':} 
-> 
Service {'tomcat': ensure => running } 

Auf Puppe anwenden, es beschwert sich, dass

'Error: Duplicate declaration: Service[tomcat] is already declared in file'

Wie dieses Problem zu beheben. Was ist das Rezept in Marionette, um einen Service zu stoppen, etwas Aktion durchzuführen und dann den Service wieder zu bringen?

Antwort

5

In Puppet können Sie den gleichen Dienst nicht erneut deklarieren. Das ist der Fehler, den du hast.

Mit Marionette, müssen Sie nicht Tomcat Stop/Start-Prozesse kümmern. Es kümmert sich um den endgültigen Status ("idemotcy" genannt). Nachdem Sie die Beziehung zwischen Paket, Konfigurationsdateien und Diensten definiert haben, werden alle Aufträge für Sie erledigt. Zum Beispiel müssen Sie die folgenden Prozesse in der Puppe und die Unterschiede zwischen -> und ~> verstehen.

Package['tomcat'] -> File['server.xml'] ~> Service['tomcat'] 

In Ihrem Fall wenden Sie die Änderung in Tomcat-Konfigurationsdatei an, und Marpet wird die Tomcat-Dienste automatisch neu starten.

Für Ihre Referenz, hier die Copy-Paste aus Introduction to Puppet Blog zu erklären, was die Bedeutung von Idempotenz ist:

One big difference between Puppet and most other tools is that Puppet configurations are idempotent, meaning they can safely be run multiple times. Once you develop your configuration, your machines will apply the configuration often — by default, every 30 minutes — and Puppet will only make any changes to the system if the system state does not match the configured state.

-Update 2016:

Hier ist eine andere offizielle Puppet Blog-Post auf Idempotenz: https://puppet.com/blog/idempotence-not-just-a-big-and-scary-word

+1

Ich würde hinzufügen, dass Sie manchmal in der Lage sein, einen Dienst zu starten und zu stoppen. Bestellung kann nicht alles lösen. Wenn beispielsweise die UID eines Benutzers mit einem laufenden Prozess (z. B. tomcat) geändert wird, muss der Prozess zuerst gestoppt werden. – majikman

+0

Für Ihr Beispiel müssen Sie eine andere Reihenfolge definieren, wenn sich die UID eines Benutzers geändert hat und ein Neustart des Dienstes erforderlich ist. – BMW

+0

Dieser Beitrag erläutert das Konzept, bietet aber keine Lösung. Deshalb schlage ich vor, Felix Franks Antwort als "richtig" zu akzeptieren. – Christian

1

Dies ist mit Puppet nicht direkt möglich, da @BMW richtig schließt. Es gibt jedoch noch einige weitere Punkte.

Es gibt einige vielversprechende work in progress, die begrenzte Unterstützung für die Deklaration des Übergangszustands hinzufügen wird. Dies wird jedoch (zumindest in seinem aktuellen Alpha-Zustand) nicht erlauben, einen solchen Zustand in Vorbereitung auf und während der Anwendung einer ganzen Klasse einzugeben.

Eine häufige Problemumgehung für diese Art von Problem besteht darin, die betreffende Entität mit zwei oder mehr Ressourcen zu verwalten. Der exec Typ ist eine gute Lösung, weil er praktisch alles verwalten kann. Der offensichtliche Nachteil ist, dass die exec auf Ihre Agenten zugeschnitten werden muss (was wissen Sie - es gibt schließlich einen Punkt zu Puppets Typ-System ;-). Unter der Annahme, dass das Manifest für eine Plattform sein wird, nur, das ist ganz einfach:

exec { 
    'stop-tomcat': 
     command => 'service tomcat stop', 
     onlyif => 'service tomcat status', 
     before => [ 
      Class['config'], 
      Service['config'], 
     ], 
} 

Bestellung der execvorService['config'] redundant ist (weil die service erfordert die class), aber es ist eine gute Praxis zum Ausdruck bringen, dass die service Ressource sollte das letzte Wort haben.

Verwandte Themen