首页 > 解决方案 > 厨师如果声明被破坏

问题描述

我有一个简单的厨师食谱,如果文件存在,它应该是厨师。如果确实存在,它应该终止,如果不存在,则继续下一个配方:

file '/tmp/db_backup.lock' do
    action :nothing
    only_if { ::File.exist?('/tmp/db_backup.lock') }
    raise "backup in progress since"
    not_if { ::File.exist?('/tmp/db_backup.lock') }
    include_recipe "#{cookbook_name}::hostname"
end

但是,当我对服务器运行此代码时,它总是失败并打印出 raise 语句。任何人都可以建议可能是这个逻辑的问题吗?

标签: chef-infra

解决方案


raise像这样的资源中间的语句总是会失败并在 Chef编译阶段输出你的 raise 语句。此外,您不能include_recipe像这样在另一个资源中运行。最后,你不应该有多个守卫,在这种情况下,这些守卫是相互冲突的。一个告诉资源在文件存在时不运行,另一个告诉它仅在文件存在时运行。你需要做的是这样的:

if ::File.exist?('/tmp/db_backup.lock')
  raise 'backup in progress, stopping'
else
  include_recipe "${cookbook_name::hostname}"
end

如果文件存在,这将引发异常,否则它将运行包含的配方。

或者,如果您想跳过包含的食谱但继续 Chef 运行,您可以执行以下操作:

if ::File.exist?('/tmp/db_backup.lock')
  Chef::Log.warn("backup in progress, skipping #{cookbook_name::hostname}")
else
  include_recipe "#{cookbook_name::hostname}"
end

推荐阅读