web-dev-qa-db-ja.com

シェフによるサービスの停止と開始

私のレシピには次の行があります

service "Apache" do
  action :stop
end

# Do something..

service "Apache" do
  action :start
end

2番目のブロックが実行されていないことがわかりました。何らかの理由?

6
Howard

通知はこれを処理する正しい方法です。

以下を実行するとします。

  • 条件付きでファイルをダウンロードする
  • ファイルがダウンロードされた場合
    • Apacheをすぐに停止する
    • ファイルを処理する(例:解凍するか移動する)
    • Apacheを再起動します

あなたはこのようにします:

# 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
10
kgilpin

問題は、リソースの名前が同じであるということです。サービス「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

8
mray

これに追加するには;

/etc/init.d/<DAEMON> statusが0以外を返さない限り、Chefはサービスを開始しません。0を返す場合、chefは実行中であると見なします。

1
user101130

Mrayとkgilpinの答えは完璧ですが、最近問題に遭遇しました。

どういうわけか、mysqlサービスは再起動する前に停止しなかったため、レシピが失敗しました。 「実行」リソースを使用して回避策を使用しました(Ubuntuでのみ動作するレシピが必要です)。実行は停止/開始を待機していますが、サービスは早く終了する可能性があります(デーモンではなく初期スクリプトが終了します)

「サービスの停止」を実行するdo 
コマンド「サービスの停止」
終了

私はこのソリューションを誇りに思っていませんが、私にとってはうまくいきます。

1
Lukino