私のレシピには次の行があります
service "Apache" do
action :stop
end
# Do something..
service "Apache" do
action :start
end
2番目のブロックが実行されていないことがわかりました。何らかの理由?
通知はこれを処理する正しい方法です。
以下を実行するとします。
あなたはこのようにします:
# Define the Apache service but don't do anything with it
service "Apache" do
action :nothing
end
# Define your post-fetch script but don't actually do it
execute "process my file" do
... your code here
action :nothing
notifies :start, "service[Apache]"
end
# Fetch the file. Maybe the file won't be fetched because of not_if or checksum.
# In that case Apache won't be stopped or started, it will just keep running.
remote_file "/tmp/myfile" do
source "http://fileserver/myfile"
notifies :stop, "service[Apache]", :immediately
notifies :run, execute["process my file"]
end
問題は、リソースの名前が同じであるということです。サービス「Apache」は一意ではないため、シェフがそれらの重複を排除しています。あなたのオプションは、このようにそれらに別々の名前を付けることです
service "Apache stop" do
service_name "Apache"
action :stop
end
# Do something
service "Apache start" do
service_name "Apache"
action :start
end
「#Do something」ブロックからの通知を使用して、サービス「Apache」に:restartを送信することもできます。これは、人々が使用する通常のパターン、単一のサービス、通知の送信(またはサブスクライブの使用)です。詳細はこちら:
http://wiki.opscode.com/display/chef/Resources#Resources-Notifications
これに追加するには;
/etc/init.d/<DAEMON> status
が0以外を返さない限り、Chefはサービスを開始しません。0を返す場合、chefは実行中であると見なします。
Mrayとkgilpinの答えは完璧ですが、最近問題に遭遇しました。
どういうわけか、mysqlサービスは再起動する前に停止しなかったため、レシピが失敗しました。 「実行」リソースを使用して回避策を使用しました(Ubuntuでのみ動作するレシピが必要です)。実行は停止/開始を待機していますが、サービスは早く終了する可能性があります(デーモンではなく初期スクリプトが終了します)
「サービスの停止」を実行するdo コマンド「サービスの停止」 終了
私はこのソリューションを誇りに思っていませんが、私にとってはうまくいきます。