web-dev-qa-db-ja.com

Chefが「通知」してサービスの再起動またはリロードに失敗する

Chef-solov10.12.0を使用してUbuntu12.04 VMを構成していますが、構成ファイルが変更されたときにサービスが期待どおりに再起動または再ロードされないという問題が発生し続けます。

ログにはエラーはありませんが、レシピの他のすべてを明確に実行しています。回避策として、サービスを手動で再起動するか、レシピが実行されるたびに再読み込み/再起動を強制してきましたが、何が問題かを理解し、期待どおりに機能させることを望んでいます。

常に期待どおりに機能しない1つのレシピ例:

package "pgbouncer"

cookbook_file "/etc/default/pgbouncer" do
    source "pgbouncer/pgbouncer"
    owner "root"
    group "root"
    mode 0644
end

service "pgbouncer" do
    supports :start => true, :stop => true, :restart => true, :reload => true, :status => true
    action [:enable, :start]
end

cookbook_file "/etc/pgbouncer/userlist.txt" do
    source "pgbouncer/userlist.txt"
    owner "postgres"
    group "postgres"
    mode 0640
    notifies :restart, "service[pgbouncer]"
end

template "/etc/pgbouncer/pgbouncer.ini" do
    source "pgbouncer/pgbouncer.ini"
    owner "postgres"
    group "postgres"
    mode 0640
    variables :postgres_Host => node[:postgres_Host]
    notifies :restart, "service[pgbouncer]"
end
5
John Debs

最初に確認するのは、chef-clientを実行しているユーザーが、サービスを開始/再起動する権限を持っていることです(通常は問題ありません)。

次に、このレシピのロジックを妨げている他のレシピが実行されていないことを確認します(時には問題ですが、頻繁ではありません)。

私が本当にあなたの問題を引き起こしていると思うのは、シェフがシェルを介して実行する必要があるもののキューを処理する方法です。同じサービスへの複数のやや矛盾する呼び出しは、予期しない動作につながる可能性があります(すでに見てきたように)。デフォルトでは、すべての「シェル」呼び出しは、chef-client実行の収束フェーズの最後の部分として処理されます。さらに、シェフは特定の実行順序を保証していません。そのため、多くの場合、順序が乱れ、操作しているサービスのソフトウェアによっては望ましくない動作が発生する可能性があります。通常、必要なのは以下のテクニックでそれを打ち消すだけです。

あなたの質問に対する迅速で汚い答えは、通知呼び出しに:timer引数を追加することです。 DOC: http://docs.opscode.com/resource_common.html#notifications-timers

上記のコード例の推奨アップデートは次のとおりです。

package "pgbouncer"

service "pgbouncer" do
    supports :start => true, :stop => true, :restart => true, :reload => true, :status => true
    action [:enable, :start]
end

cookbook_file "/etc/default/pgbouncer" do
    source "pgbouncer/pgbouncer"
    owner "root"
    group "root"
    mode 0644
end

cookbook_file "/etc/pgbouncer/userlist.txt" do
    source "pgbouncer/userlist.txt"
    owner "postgres"
    group "postgres"
    mode 0640
    notifies :restart, "service[pgbouncer]", :immediately
end

template "/etc/pgbouncer/pgbouncer.ini" do
    source "pgbouncer/pgbouncer.ini"
    owner "postgres"
    group "postgres"
    mode 0640
    variables :postgres_Host => node[:postgres_Host]
    notifies :restart, "service[pgbouncer]", :immediately
end

これは、デーモンが冗長なアクションを実行しすぎる可能性があるため、最も効率的な方法ではありません(1回の実行で最大3つの「startlike」呼び出し:start、restart、restart)。定義を活用してchefでこれを行うための別のもっとOOPフレンドリーな方法があります(DOC: http://docs.opscode.com/essentials_cookbook_definitions.html ) 。これは基本的に、効果的に実行されることを保証しながら冗長な呼び出しを実行する非効率性を減らすために定義するpgbouncerサービスリソースのカスタムラッパーになりますが、ユースケースに最適なものを決定するのはあなたに任せます。

2
Gregory Patmore

これは、一般的にリソースと通知に関してかなり一般的な問題のようです。

Opscode JIRAチケットトラッカーをざっと見てみましたが、通知とリソースの動作に対する大量の変更と修正について説明した ticket があり、10.14.0でリリースされる予定です。

0
Mike Fiedler

PgbouncerがUpstartまたはInitのどちらを提供しているかわからない(ここからInitのように見える: http://packages.ubuntu.com/precise/AMD64/pgbouncer/filelist )が、これを与えるそれでも問題が解決しない場合は、サービスリソースで撮影してください。

service "pgbouncer" do
  provider Chef::Provider::Service::Init
  supports :start => true, :stop => true, :restart => true, :reload => true, :status => true
  action [:enable, :start]
end

さらに、GregoryPatmoreが提案した:immediately引数も追加します。

0
megabytemike

サービス定義を次のように変更してみます

service "pgbouncer" do
    supports :start => true, :stop => true, :restart => true, :reload => true, :status => true
    action :enable
end

少し前に似たようなことを経験したことを覚えていると思いますが、これが原因でした。これで問題が解決したかどうかをお知らせください。何らかの理由で、これまでのところサービスを定義しているので、問題は発生していません。

0
Bjorn248