2012-09-24 79 views
9

有沒有任何方法可以測試廚師食譜中是否存在cookbook_file?我想這樣做如下:廚師 - 測試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工作。

我不希望有需要的cron作業一樣

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

因爲這似乎相當脆服務的大名單。理想情況下,我希望有一個包含需要它們的服務的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的源:

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交互是有風險的。這就是爲什麼依靠chef_gem是一個好主意,這個寶石可以處理多種版本的Chef,它可以減少配方代碼中的視覺混亂,並且使得配方的代碼更具可讀性,而且如果DSL被深思熟慮的話。

相關問題