Chefを使用してサービスが実行されていることを確認するにはどうすればよいですか?


10

Chefがサービス(postgres)を開始する可能性がありますが、その後、帯域外で停止される可能性があります。後続のChef実行でサービスを実行させたい。私はこれを試しました:

service "postgresql" do
    action :start
end

しかし(up to date)、シェフが起動したことをシェフが認識しており、停止したことを認識できないためと考えて、効果はありません。(おそらくservice ... statusこのサービスでどのように動作するためですか?)これを書いた場合:

# anti-pattern warning!
execute "force-start-postgresql" do
  command "service postgresql start || /etc/init.d/postgresql start"
  action :run
end

私は望ましい振る舞いをします。また、action :restartそれを実行させます。ただし、これらは移植性のため(そして後者の場合は再開する前に停止する可能性があるため)、アンチパターンのように見えます。

では、Chefがすでに実行されていると考えている場合でも、サービスを強制的に開始するように指示するにはどうすればよいですか?

これは、OpsCodeによってホストされているChef 11.6とデフォルトのpostgresqlレシピを使用しています。(これは似ていますが、Chefで「最新の」リソースにアクションを強制する方法とはまったく同じではないと思いますか?

--- 編集(jtimberlandポストに続く説明)---

-l debugここに示しています:

DEBUG: service[postgresql] supports status, running
DEBUG: service[postgresql] is running

それが実行されていないときでも。だからそれは一つのバグのように聞こえます、そして私はそれに興味があります。ただし、私は主にChefに「ステータスチェックをスキップして、常にサービス開始コマンドを呼び出す」ように指示する方法があるかどうかに興味があります。それがここでの質問です。

(私は専門家だが、私はサービスが実行されていることを確認するための最もポータブルな方法は、サービスとそのほとんど常に冪等ですを開始することだと思います。大藤チェックサービスが実行されているかどうかはあまり一致しており、私たちは気にしなければならない理由は、私が表示されません!)

回答:


11

デフォルトでは、Chefはサービスが実行されているかどうかをチェックし、サービスが実行されていない場合は開始します。

サービスが実行されていると判断する方法は異なります。

デフォルトでは、Chefはpostgresqlを使用してプロセステーブル内のサービス(ここ)の名前を照合しようとしpsます。

ps -ef | grep postgresql

本質的に。サービスの名前は、プロセステーブルの検査時にパターンマッチに使用されます。これは、特にプラットフォームと「postgresql」サービスの命名方法に応じて、必要な場合と必要でない場合があります。

ただし、サービスが「ステータス」コマンドをサポートしていることをChefに伝えることができます。つまり、Chefは通常、次のようなことを行います。

/etc/init.d/postgresql status

そして、戻りコードを使用して、それが実行されているかどうかを判別します(ゼロ以外は実行されていません)。

すべてのサービススクリプトがステータスコマンドをサポートするわけではないので(デフォルトで)、シェフはこれを行いません。それは正気なデフォルトのことをしようとしますが、時にはナイーブです。したがって、リソースにステータスコマンドがあり、それほどナイーブではないことをChefに伝えることができます。

service "postgresql" do
  supports :status => true
  action :start
end

ここで、サービスの名前が「postgresql」ではなく、「postgresql-92」などの場合、次のように実行できます。

service "postgresql-92" do
  supports :status => true
  action :start
end

または

service "postgresql" do
  service_name "postgresql-92"
  supports :status => true
  action :start
end

デバッグ出力を使用してchefを実行することにより、何が起こっているかをさらに詳しく知ることができます。

chef-client -l debug

これは便利ですが、質問の答えにはなりません。私がすることを伝えたい:start かかわらず:status。また、私はそれがps -ef | grep [p]ostgresql同様のことを望んでいます、そうでなければそれは通常それ自身のgrepコマンドと一致し、したがって常にサービスが実行されていると考えます。(または、それが根本的な問題なのでしょうか?)
部分的に曇り

Chefにバグがあるか、システムに問題があるようです。実行しているplatform / platform_versionは何ですか?どのようにpostgresqlをインストールしましたか?パッケージ、ソース?
jtimberman 2013

つまり、シェフは、宣言的な方法で定義されたリソースを管理するためにべき等のアクションを実行します。Chefでサービスが実行されていることを確認する方法は、開始アクションをサービスに送信することです。それが発生していない場合、それはChefのバグ、レシピのバグ、またはシステムのバグです。
jtimberman 2013

@jtimbermanに感謝します。間違ったステータスがticket.opscode.com/browse/COOK-334に返されるバグをオープンしました。ただし、私の質問は、ステータスチェックをスキップして、chefにservice-startコマンドを発行させる方法があるかどうかです。service startほとんど常にべき等であるため、これで問題ありません。
曇り

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.