11

有什么方法可以测试给定的食谱文件是否存在于厨师食谱中?我想做类似以下的事情:

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 存在,则无法进行有利的测试。但是如果没有找到文件,你可以让厨师继续运行而不是失败。

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 回答
4

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

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

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

于 2014-05-22T06:57:56.697 回答
3

总的来说,我建议使用@JonathanM 提供的答案。

如果你不想依赖 a chef_gem,这里是你需要的代码。这段代码已经过测试,Chef 11.12.8但我想它应该适用于任何Chef 11.x版本。

要检查 acookbook_file的来源:

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

要检查 atemplate的来源:

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 被深思熟虑,它也使菜谱的代码更具可读性。

于 2014-09-24T15:38:52.193 回答