厨师if语句坏了

时间:2018-05-18 19:14:48

标签: chef

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

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语句。任何人都可以提出这个逻辑的问题吗?

1 个答案:

答案 0 :(得分:1)

资源中间的raise语句将始终失败并在Chef compile phase期间输出您的raise语句。此外,您无法在其他资源中运行include_recipe。最后,你不应该有多个警卫,在这种情况下,这些警卫是冲突的。如果文件存在,则告诉资源不运行,另一个告诉它仅在存在时才运行。你需要做的是这样的事情:

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

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

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

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