2013-11-21 3 views
6

In einem Rezept möchte ich überprüfen, ob ein Service installiert ist, und wenn es nicht die 3 Ressourcen benachrichtigen, die benötigt werden, um es zu installieren. Ich habe versucht, die Service-Ressource, die den Dienst bei der Installation korrekt identifiziert, aber eine Ausnahme auslöst, wenn der Dienst nicht installiert ist.Chef: Wie überprüfe ich, ob ein Service installiert ist?

Ich bin mir nicht sicher, welche Aktion hier zu verwenden ist. : Nichts überspringt die Ressource so, dass sie jemals ausgeführt wird, aber jede der anderen Aktionen führt zu einem Fehler, wenn sie versuchen, auf einen Dienst zu reagieren, der nicht existiert.

Wie erkenne ich, ob ein Service installiert ist und handle basierend auf diesen Informationen?

Ich laufe auf Windows, wenn das relevant ist.

Antwort

8

Werfen Sie einen Blick auf, wie sich Service für Fenster definiert ist

https://github.com/opscode/chef/blob/master/lib/chef/provider/service/windows.rb

AFAIU seinen hübschen straighforward Importparameteraddierroutine Ihrem Rezept:

require 'win32/service' 

und dann können Sie überprüfen, ob Dienst vorhanden ist mit

Win32::Service.exists?(@new_resource.service_name) 

voila - Sie kann importmentation in library (http://docs.opscode.com/essentials_cookbook_libraries.html) nur nicht um rezeptcode zu verschmutzen und haben einfache methode service_exists ?.

+3

Das hat mich auf den richtigen Weg gebracht. Ich habe es ohne die require-Anweisung funktioniert. In diesem Mailinglisteneintrag: http://lists.opscode.com/sympa/arc/chef/2013-03/msg00223.html die Anweisung 'if! :: Win32 :: Service.exists? (" Test_service_name ") ' erkennt korrekt, ob der Dienst existiert. Der führende :: sagen Sie, dass es nicht in den Namensraum Chef zu suchen. – CPS

+0

@Gadolin können Sie bitte die Syntax von CPS Kommentar hinzufügen? –