3

chefレシピのエラーをデバッグするとき、私は通常、問題のあるマシンにログオンして「shef-z」と入力するのが好きです。以前に正常に実行された場合は、登録されたrun_listに関連するすべての属性とレシピが自動的に読み込まれるため、問題のある行をすぐに試すことができます。

問題は、chef-clientが最初の実行で失敗した場合、run_listが空であり、shefが「このクライアントではクックブックはもう必要ない」と言ってキャッシュから(非常に必要な)レシピを削除することです。shefにrun_listの使用を強制する方法はありますか?

公式ウィキは次のように述べています。

「実行リストは、通常のchefクライアントの実行と同じ方法で設定されます。」

しかし、「-j」を試してみても役に立たないようです。

このブログ投稿で説明されているように、代わりにソロモード( "-s -j")を実行してみました。run_listをロードします(展開せずに、これは奇妙です)が、何かをしようとすると、次のようなものが表示されます。

「クックブックのTomcatが見つかりません。別のクックブックからTomcatをロードしている場合は、メタデータで依存関係を構成してください」。

私のレシピには3レベルの深さの数十の依存関係があるため、すべてのコードを手動でshefに貼り付けることは実際にはオプションではないことに注意してください。私の現在の回避策は、問題の可能性のあるすべての部分をコメントアウトして(そしてそこから手動で続行して)変更されたレシピをアップロードすることですが、より良い代替案が欲しいです。

4

2 に答える 2

2

クライアントモードまたはソロモードでshefを起動する場合、レシピはデフォルトでは含まれていません。これは、shefの使用例は、例外を引き起こすコンパイル時のバグなど、レシピがまったく読み込まれない理由を判別することであるためです。

したがって、使用するレシピを含めるには、include_recipeを使用する必要があります。これは、ノードの実行リストにあるすべてのロール/レシピに対して、次の方法で自動的に実行できます。

node.run_list.expand(node.chef_environment).recipes.each do |r|
  include_recipe r
end

これに関する詳細、およびShefを使用してchef-clientの実行をデバッグするためのその他の優れたヒントについては、StevenDannaのブログ投稿を参照してください。

于 2012-10-12T00:13:57.910 に答える
0

Chef が初めて実行されると、内部に実行リストを含む /etc/chef/first-boot.json ファイルが作成されます。実行してみてください:

shef -z -j /etc/chef/first-boot.json
于 2012-10-11T15:42:29.383 に答える