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服务器上安装它吗?