2013-11-21 5 views
6

In una ricetta voglio verificare se è installato un servizio e se non è necessario notificare le 3 risorse necessarie per installarlo. Ho provato la risorsa di servizio, che identifica correttamente il servizio quando è installato, ma genera un'eccezione se il servizio non è installato.Chef: come faccio a verificare se è installato un servizio?

Non so quale azione utilizzare qui. : nulla salta la risorsa in modo che venga mai eseguita, ma una qualsiasi delle altre azioni genera un errore quando tenta di agire su un servizio che non esiste.

Come rilevare se un servizio è installato e agire in base a tali informazioni?

Sono in esecuzione su Windows, se questo è rilevante.

risposta

8

Prendere uno sguardo a come è il servizio per le finestre è definito

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

AFAIU suo add abbastanza straighforward importazione la vostra ricetta:

require 'win32/service' 

e poi si può verificare se il servizio esiste con

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

voilà - si può mettere l'impementation alla libreria (http://docs.opscode.com/essentials_cookbook_libraries.html) solo per non inquinare il codice della ricetta e hanno un semplice metodo service_exists ?.

+3

Questo mi ha fatto sulla buona strada. L'ho fatto funzionare senza la dichiarazione require. Per questa voce della mailing list: http://lists.opscode.com/sympa/arc/chef/2013-03/msg00223.html la dichiarazione 'if! :: Win32 :: Service.exists? (" Test_service_name ") ' rileva correttamente se il servizio esiste. Il protagonista :: dillo di non guardare nello spazio dei nomi di Chef. – CPS

+0

@Gadolin puoi aggiungere la sintassi dal commento di CPS? –