退出时例外

时间:2015-04-07 03:50:29

标签: chef-recipe

我正在写一份厨师食谱,如下所示。我希望配方可以在此之后停止继续执行资源,但不会给出异常。

除了退出(0)

之外,您对此有任何想法吗?
ruby_block "verify #{current_container_name}" do
  block do
    require "docker"

    begin
      container = Docker::Container.get(current_container_name)
    rescue Docker::Error::NotFoundError => exception
      container = nil
    end

    if container.nil?
      exit(0)
    end
  end
end 

2 个答案:

答案 0 :(得分:0)

您可以在此ruby块中使用ignore_failure true,而不是处理异常。这样它仍然会输出错误消息,但不会将其视为失败,因此会继续执行后续资源。

答案 1 :(得分:0)

如果你想在特殊情况下中止一名厨师 - 比如当前的Docker-container不可用 - 这是不可能的。解决方案是重新考虑您的问题 - 您希望某些代码仅在满足特殊条件时运行。

您可以通过离开配方(使用return true),将配置步骤封装在条件子句(如if my_container.nil? then ... end)中,也可以使用node-attributes来逐步执行条件。

让我们说你的食谱x依赖于三个食谱,1,2和3.所以,如果你想定义2和3仅在1成功的情况下运行,你就可以了能够将第一个配方的状态写入节点属性(fe node.normal['recipe1'] = 'successful')。

在其他食谱中,您将定义一个入口门,如:

return true if node['recipe1'] != 'succesful'

但请注意,如果您使用节点属性,则需要在第一个配方的末尾使用ruby_block - 资源(主要是),因为裸红宝石代码在资源编译期间进行评估和运行 - 在汇聚运行之前进行。