【问题标题】:Chef - Test for cookbook_file existenceChef - 测试 cookbook_file 是否存在
【发布时间】:2014-09-24 23:38:52
【问题描述】:

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

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

【问题讨论】:

    标签: chef-infra cookbook


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 你必须在厨师服务器上安装它?
      【解决方案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 考虑周全,也可以使菜谱的代码更具可读性。

      【讨论】:

        猜你喜欢
        • 2015-12-19
        • 1970-01-01
        • 1970-01-01
        • 2011-08-05
        • 2011-02-16
        • 2013-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多