Chef infra Chef-测试是否存在cookbook_文件

Chef infra Chef-测试是否存在cookbook_文件,chef-infra,cookbook,Chef Infra,Cookbook,有没有办法测试厨师食谱中是否存在给定的食谱文件?我想做如下工作: 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作业 我不想有一个大的服务列表,其

有没有办法测试厨师食谱中是否存在给定的食谱文件?我想做如下工作:

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作业,并且如果这些文件不存在,则配方不会失败。我正在寻找的是可能的吗?

据我所知,如果cookbook\u文件存在,则不可能在advantage中进行测试。但是如果chef没有找到文件,您可以让它继续运行而不是失败

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

试试这个
chef\u gem

然后,您可以使用
has_source
仅当
文件在配方中时
例如:


仅当{has_source?(“optional.config.file”,:files)}
总之,我建议使用@JonathanM提供的

如果您不想依赖厨师长宝石,这里是您需要的配方代码。这段代码是在Chef 11.12.8上测试的,但我想它应该适用于任何Chef 11.x版本

要检查
烹饪书\u文件
的来源:

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}") }
要检查
模板的源代码,请执行以下操作:

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\u name
在任何配方中都是隐式可用的,并且具有当前cookbook name作为值。要检查另一本食谱是否有模板或文件,请用硬编码字符串替换
cookbook\u name
,例如
“java”


请注意,使用Chef内部API是有风险的,因为代码可能会在主要版本之间更改(我认为在次要版本之间也是如此)。这就是为什么依赖chef_gem是个好主意的原因,gem可以处理多个版本的chef,如果DSL经过深思熟虑,它可以减少配方代码中的视觉混乱,并使配方代码更具可读性。

您必须在chef服务器上安装它吗?