2016-04-03 3 views
1

Ich bin neu zu Koch und versuchen zu verstehen, warum dieser Code keinen Fehler zurückgibt, während, wenn ich das gleiche mit 'Start' mache ich einen Fehler für einen solchen Service nicht existiert.Kein Fehler beim Beenden nicht vorhandenen Service mit Koch

service 'non-existing-service' do 
    action :stop 
end 

# chef-apply test.rb 
Recipe: (chef-apply cookbook)::(chef-apply recipe) 
    * service[non-existing-service] action stop (up to date) 
+1

Welche OS und/oder Dienstanbieter? – coderanger

+0

Ich habe es auf rhel6 mit initd und auf rhel7 mit systemd getestet. –

+0

Nun, ich denke, es ist das erwartete Verhalten, zumindest aus meiner Sicht. Wenn Sie ein Kochrezept erstellen, geben Sie eigentlich nicht an, was Sie ** tun wollen **, sondern in ** welchem ​​Zustand das System sein soll **. Der angehaltene Dienst tut nichts, also ist es wie nicht existierender Dienst. –

Antwort

1

Sie wissen nicht, welche Platt Sie laufen auf, wenn Sie auf Windows ausgeführt werden es mindestens
Chef::Log.debug "#{@new_resource} does not exist - nothing to do" gegeben log sollte, dass Sie Debug als Protokollebene haben.

Sie könnten argumentieren, dass dies das falsche Verhalten ist, aber wenn der Service nicht existiert, wird es nicht laufen.

Quellcode https://github.com/chef/chef/blob/master/lib/chef/provider/service/windows.rb#L147

+0

Sie sind richtig, ich sehe diesen Fehler nur im Debug-Modus, aber ist es nicht sinnvoll, diese Informationen im Standardmodus anzuzeigen? –

+0

Nun, ich kann dem zustimmen. Ich denke, das Logging in Chef's Info-Log ist ziemlich spärlich. –

1

Wenn Sie eine der Varianten des init.d Provider bekommen, die Standard sie durch greppen die Prozesstabelle den aktuellen Status eines Service zu bekommen. Da Chef intern vor dem Aufruf der Stop-Methode des Providers eigene Idempotenz-Prüfungen durchführt, würde es sehen, dass es keinen solchen Prozess in der Tabelle gibt und annehmen, dass es bereits gestoppt wurde.

+0

Ich dachte, dass dies der Fall ist, weil es nach dem Prozess und nicht nach dem Service selbst sucht. aber wie würde jemand validieren, dass das Rezept korrekt ist, wenn es auf der Versionsverteilung läuft, wo sich der Name des Dienstes ändert. –

+0

Mit Systemd sollten Sie einen Fehler von Systemctl erhalten, wenn Sie versuchen, den Status einer unbekannten Einheit zu erhalten, denke ich. Mit den initd-Providern können Sie 'supports status: true' setzen, um' /etc/init.d/name status' zu verwenden, um den Status anstelle von pgrep zu erhalten, was einen Fehler verursachen würde. – coderanger

+0

Ich habe versucht, dass in Rhel6 und Rhel7 beide das gleiche Ergebnis. (kein Fehler) –

Verwandte Themen