2016-04-03 3 views
1

シェフには初めてのことですが、なぜこのコードがエラーを返さないのか理解しようとしています。シェフと一緒に存在しないサービスを停止するとエラーは発生しません

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

どのOSおよび/またはサービスプロバイダですか? – coderanger

+0

私はinitdでrhel6で、systemdでrhel7でテストしました。 –

+0

まあ、私はそれが少なくとも私の視点からは期待される行動だと思います。あなたがシェフのレシピを作成するときには、あなたは実際にはそうではなく、あなたが何をしたいのか**、**どの状態がシステムであるべきか**を考えてください。 停止したサービスは何もしないので、存在しないサービスのようです。 –

答えて

1

はあなたがWindows上で実行している場合、それは少なくともあなたは、ログレベルとしてデバッグを持っていることを考えると
Chef::Log.debug "#{@new_resource} does not exist - nothing to do" をログに記録する上で実行されているplattformいるか分からないのです。

これは間違った動作だと言えるかもしれませんが、サービスが存在しなければ、それは確実に実行されていません。

ソースコード https://github.com/chef/chef/blob/master/lib/chef/provider/service/windows.rb#L147

+0

あなたは正しいですか?このエラーはデバッグモードでのみ表示されますが、この情報をデフォルトモードで表示するのは意味がありませんか? –

+0

さて、私はそれに同意することができます。私はシェフの情報ログに記録されているのはかなり稀だと思います。 –

1

あなたがinit.dプロバイダの変異体の1を取得している場合は、プロセステーブルをgrepをすることによって、サービスの現在のステータスの取得をデフォルトに。 Chefはプロバイダのstopメソッドを呼び出す前に独自の冪等性チェックを内部的に行うので、テーブルにそのようなプロセスがないことがわかり、すでに停止していると仮定します。

+0

私はそれがサービスそのものではなくプロセスを探していると考えています。サービスの名前が変更されているバージョンの配布で実行しているときに、レシピが正しいことを誰かが確認する方法はありますか。 –

+0

systemdでは、私が思っている未知のユニットのステータスを取得しようとすると、systemctlからエラーが出るはずです。 initdプロバイダでは、 '/etc/init.d/name status'を使用してpgrepの代わりにステータスを取得するよう' 'ステータスをサポートしています:true'を設定できます。これはエラーになります。 – coderanger

+0

私はrhel6とrhel7の両方で同じ結果を試しました。 (エラーなし) –

関連する問題