2012-09-24 13 views
9

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

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

およびファイル「など/ cron.d/{SERVICE_NAME}」が存在しない場合、私は多くのサービスがマシン上で実行されている可能性があるので、それは、失敗しない持っていますしかし、そのうちのいくつかだけが関連するcronジョブを持っています。

私はそれがかなり脆いと思われるので、

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

のようなcronジョブを取るサービスの大きなリストを持っている必要はありません。理想的には、私はそれらを必要とするサービスのためのcronジョブを含むディレクトリを持っていて、これらのファイルが存在しなければ失敗しないようにしています。私が探しているものは可能ですか?

答えて

6

私が知る限り、cookbook_fileが存在すれば、テストすることはできません。しかし、シェフがファイルを見つけられなかった場合、失敗する代わりにシェフに実行を継続させることができます。

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

それは私のために十分に機能します - ありがとう! – Marc

+1

しかし、とにかくログにエラーが発生します。 – timurb

0

全体的に、私は希望@ JonathanMによって提供されたanswerを使用することを提案します。

chef_gemに依存したくない場合は、レシピに必要なコードをここに入力してください。このコードはChef 11.12.8でテストされましたが、それはChef 11.xバージョンで動作するはずです。

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

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

':

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

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

Chef社の内部APIを使用すると、メジャーリリース間でコードが変更される可能性があることに注意してください(マイナーリリース間でも)。だからこそchef_gemの頼みが良いアイデアです。宝石はシェフの複数のバージョンを扱うことができ、レシピコードの視覚的な混乱を減らし、DSLがよく考えられている場合でもレシピのコードを読みやすくします。

関連する問題