11

特定の cookbook_file がシェフのレシピに存在することをテストする方法はありますか? 次のようなことをしたいと思います。

cookbook_file "/etc/cron.d/#{service}" do
  source "etc/cron.d/#{service}"
  owner "root"
  group "root"
  mode "0644"
end

ファイル「etc/cron.d/{service_name}」が存在しなくても失敗しないようにします。これは、マシン上で多くのサービスを実行している可能性がありますが、cron ジョブが関連付けられているのはそれらの一部のみであるためです。

次のようなcronジョブを実行するサービスの大きなリストは必要ありません

['service_1', 'service_2', ...],

それはかなり脆いように見えるからです。理想的には、必要なサービスの cron ジョブを含むディレクトリを作成し、これらのファイルが存在しなくてもレシピが失敗しないようにしたいと考えています。私が探しているものは可能ですか?

4

3 に答える 3

7

私が知る限り、cookbook_file が存在するかどうかを有利にテストすることはできません。ただし、ファイルが見つからない場合は、chef に失敗する代わりに実行を継続させることができます。

cookbook_file "/etc/cron.d/#{service}" do
  source "etc/cron.d/#{service}"
  owner "root"
  group "root"
  mode "0644"
  ignore_failure true
end
于 2012-09-26T10:28:04.677 に答える
3

全体として、@ JonathanM が提供する回答を使用することをお勧めします。

に依存したくない場合はchef_gem、レシピで必要なコードをここに示します。このコードはテスト済みChef 11.12.8ですが、どのChef 11.xバージョンでも動作するはずです。

cookbook_fileのソースを確認するには:

only_if { run_context.has_cookbook_file_in_cookbook?(cookbook_name, "etc/cron.d/#{service}") }

templateのソースを確認するには:

only_if { run_context.has_template_in_cookbook?(cookbook_name, "etc/cron.d/#{service}") }

この変数cookbook_nameは、任意のレシピ内で暗黙的に使用可能であり、現在のクックブック名​​を値として持ちます。別のクックブックにテンプレートまたはファイルがあるかどうかを確認するにはcookbook_name、ハードコードされた文字列に置き換えます"java"

コードはメジャー リリース間で (マイナー リリース間でも) 変更される可能性があるため、Chef の内部 API をいじるのは危険であることに注意してください。gemchef_gemは Chef の複数のバージョンを処理でき、レシピ コードの視覚的な混乱を減らし、DSL がよく考えられていれば、レシピのコードをより読みやすくします。

于 2014-09-24T15:38:52.193 に答える