有没有办法测试厨师食谱中是否存在给定的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作业,并且如果这些文件不存在,则配方不会失败。我正在寻找什么?
答案 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_gem
:
http://www.rubydoc.info/github/3ofcoins/chef-helpers
然后,您可以使用配方中的has_source
到only_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>