Chef - 测试cookbook_file存在

时间:2012-09-24 19:54:25

标签: chef cookbook

有没有办法测试厨师食谱中是否存在给定的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作业,并且如果这些文件不存在,则配方不会失败。我正在寻找什么?

3 个答案:

答案 0 :(得分:7)

据我所知,如果cookbook_file存在,则无法进行测试。但如果找不到文件,你可以让厨师继续运行而不是失败。

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

答案 1 :(得分:4)

试试这个chef_gemhttp://www.rubydoc.info/github/3ofcoins/chef-helpers

然后,您可以使用配方中的has_sourceonly_if文件 例如:

only_if { has_source?("optional.config.file", :files) }

答案 2 :(得分:3)

总的来说,我建议使用@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是一个好主意,gem可以处理Chef的多个版本,它可以减少配方代码中的视觉混乱,并且如果DSL经过深思熟虑,也可以使配方代码更具可读性。 / p>