3

現在、シェフを使用してサーバーをプロビジョニングしており、レシピ/クックブックをインストールして実行すると、mongo データベースにデータを自動的に追加したいと考えています。

ここから問題が発生します。実行リソースを使用して、次のように mongo スクリプトを実行していました。

execute "install-mongodb-config" do
  command "mongo #{node[:mongodb][:mongo_db_host]}/#{node[:mongodb][:mongo_db]} \"#{node[:mongodb][:mongo_add_config_script]}\""
  action :run
end

レシピのこの部分は、何を試しても常に失敗しました。ここで試したすべての詳細には触れませんが (必要な場合を除きます)、サブスクライブと通知のすべての可能性を使い果たしたとだけ言っておきましょう (と思います)。

この問題は、mongodb::10gen_repo を使用して mongodb をインストールしていることが原因です。apt-get がパッケージをインストールするとレシピは終了し、chef はさらにリソースを実行し続けます。

上記のリソースを mongodb::10gen_repo の直後に実行しようとしましたが、mongodb が利用できないようで、mongo シェルが接続してスクリプトを実行できません。表示されるエラーは、次のようなものです。

MongoDB shell version: 2.0.2
Thu Sep  6 18:40:45 ReferenceError: setTimeout is not defined mongotest.js:2
failed to load: mongoAddConfig.js

私たちが試した中で、これを素晴らしいシェフの方法で回避できたものはありません. 私たちが頼ったのは、実行リソースを次のものに置き換えることでした。

execute "install-mongodb-config" do
  command "sleep 60; mongo #{node[:mongodb][:mongo_db_host]}/#{node[:mongodb][:mongo_db]} \"#{node[:mongodb][:mongo_add_config_script]}\""
  action :run
end

これにより、mongo スクリプトが実行される前にコマンドが 60 秒間スリープ状態になります。これが正しい方法ではないことはわかっていますが、今のところ機能しています。

誰でもこれを行う正しい方法を提案できますか? mongodb シェフ スクリプトを作成した人たちと話し、機能をリクエストする必要があると感じています。

4

3 に答える 3

8

初めに。この「スリープ 60」を削除します。これはシェフが行うことができます。すべてのリソースには共通の属性があり、「再試行」と「retry_delay」はそれらの一部です。したがって、最も簡単な方法は次のとおりです。

execute "install-mongodb-config" do
  command "mongo some_command"
  action :run
  retries 6
  retry_delay 10
end

mongo データベースでコマンドを実行する必要がある場所が 2 ~ 3 か所以上ある場合は、このmongodb cookbookで作成されたものと同様の LWRP を作成することを検討してください。(特に libraries/mongodb.rb ファイルを確認してください)。そこでサーバーの応答を待つロジックを非表示にすることができます。

于 2012-09-26T18:59:23.530 に答える
1

ソフトウェアをインストールする同じ Chef 実行で初期構成も注入することは重要ですか? クックブックとレシピを構築するための「chefly」メソッドは、意図しない結果を生成することなく何度も実行できるようにするために、冪等性を防ぐことです。

この特定のケースでは、最初のレシピを mongodb のインストールと起動のみに制限します。このレシピは、mongodb がホスト上で既に実行されていることがわかった場合、何もしません。次に、mongo がセットアップされて実行されていることがわかった場合にのみ実行される別のレシピを用意します。mongodb にクエリを実行して、初期構成が完了しているかどうかを確認します。もしそうなら、それは単に戻るでしょう。そうでない場合は、構成ルーチンを実行します。

このようにして、これらのレシピはいつでもマシン上で実行できます。誰かが mongodb をアンインストールしたとしても、chef は mongodb が再び元の状態に戻っていることを確認します。

于 2012-09-22T19:44:12.953 に答える
0

だから、私はシェフについてまったく知りません。しかし、あなたの問題は、サーバーを立ち上げた直後に接続しようとすることです。

プライマリの選択、すべてのサーバーのステータスの取得などに多少のオーバーヘッドがあるため、サーバーを起動してもすぐに使用できるわけではありません。

レプリカ セットを立ち上げ、すぐに簡単なスクリプトで接続を試みることで、chef なしでこれを再現できます。したがって、シェフ固有ではありません。

サーバーの起動遅延を回避する方法があるかどうかは不明です。プライマリを起動することは、ノードをセットに追加することと比較して比較的まれな発生であると予想されるためです。

よりクリーンな唯一の潜在的な解決策は、構成で接続を形成するためのより長いタイムアウトを追加することです。これを行う方法は、mongodb のドキュメント ( http://www.mongodb.org/display/DOCS/Connections ) で見つけることができます。

関心のあるフラグはおそらく connectTimeoutMS です

于 2012-09-10T21:12:05.887 に答える