代码之家  ›  专栏  ›  技术社区  ›  ryekayo

如果语句被破坏,则为厨师长

  •  -1
  • ryekayo  · 技术社区  · 6 年前

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

    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 回复  |  直到 6 年前
        1
  •  1
  •   Brandon Miller    6 年前

    A. raise 这样的资源中间的语句 总是 在厨师长会议期间失败并输出您的加薪声明 compile phase 。此外,您不能运行 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