2

単純なアプリサーバー/データベースサーバーのセットアップについて考えてみます。データベースサーバーの場所を示す値をアプリサーバーに設定し、データベースサーバーにいくつかのアクセス許可を設定してアプリサーバーからの接続のみを許可する必要があります。

search(:node、 "role:db-server")

search(:node、 "role:app-server")

どちらのマシンのレシピ実行からも機能して、必要な情報を取得できます。しかし、検索を実行するときに1つのサーバーが存在しない場合はどうなるでしょうか。「この実行を続行しないでください」と言って、完了していないとマークする方法はありますか。そうすれば、次にchef-clientがそのマシンで実行されたときに、再試行されます。

あるいは、このユースケースに役立つ、私が見逃している気の利いたシェフがいますか(「通知」と「サブスクライブ」は、私が知る限り、それらは私が望むものとほぼ同じであるように見えます)ノード内で発生するものに関心があります)より良いですか?私が検討しているもう1つのことは、スリープ/チェックループを設定して、一方の実行を効果的に一時停止し、もう一方のサーバーが必要な場所に到達するようにすることですが、そのソリューションはかなりエレガントではなく、より複雑な設定でデッドロックの問題が発生する傾向があります。

4

1 に答える 1

2

理解した。これはもう少しエレガントにできると思いますが、ここに基本があります。ファイル/etc/test.txtがあり、それが起動してchefに登録されたら、dbサーバーからの情報を入力する必要があるとすると、アプリサーバーノードのレシピに対して次のようになります。

ruby_block "edit test.txt" do
    block do
        db_server = search(:node, %Q{role:db-server})
        rc = Chef::Util::FileEdit.new("/etc/test.txt")
        rc.search_file_replace_line(/^replace_this/, "db_server: #{db_server[0][:hostname]}")
        rc.write_file
    end
    action :create
    ignore_failure true
end

重要な部分は「ignore_failuretrue」です。これにより、そのサーバーでchef-clientを再起動するたびにレシピが再実行されます。成功したら実行を停止する方法がわかりませんが、それが不可能であることが判明した場合でも、適切なチェックを行うことで、再変更すべきではないファイルの再変更を回避できます。問題。db_server [0]を使用すると、dbサーバーが見つからない場合にレシピが失敗することに注意してください(これは、not_ifセクションに追加し、検索結果の長さを確認することで、もう少し明確にできると思います)。

于 2012-02-10T19:29:36.450 に答える