我正在写一份厨师食谱,如下所示。我希望配方可以在此之后停止继续执行资源,但不会给出异常。
除了退出(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
答案 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
- 资源(主要是),因为裸红宝石代码在资源编译期间进行评估和运行 - 在汇聚运行之前进行。