从 Chef 菜谱中返回,不引发异常

从 Chef 菜谱中返回,不引发异常

有没有办法从 Chef 菜谱中返回而不引发异常?

假设我有一个很长的配方。我想在它的开头添加一个 ruby​​ 块,它将检查某些条件(例如目录存在)并停止处理配方(但继续执行 run_list 的其余部分),如果条件成功则不会引发异常。

条件执行(only_if/not_if)不能解决问题,因为我必须将条件添加到每一个尽管配方中的资源调用可能非常多。

有一个评论在 Opscode 的 wiki 中,评论者询问了同样的问题,但没有答案。

答案1

中止配方运行的方法是使用“return”语句(例如由于某些条件)。jtimberman 的回答中对此进行了详尽的讨论一个并行的 StackOverflow 问题

答案2

我会将该配方分成两部分,并include_recipe在 if 语句中使用。例如cookbooks/foo/default.rb

some_condition = File.exists?("/etc/whatever") # Your specific check here

if some_condition
    include_recipe "foo::conditional_bit"
end

输入您的条件配方cookbooks/foo/recipes/conditional_bit.rb并添加recipe[foo]到相应节点的运行列表中。

请注意,执行顺序与指定 ruby​​ 块时略有不同。将在 chef-client 运行的“编译”阶段而不是“执行”阶段检查条件。请参阅Chef Run 的剖析页面了解详情。

相关内容