有没有办法从 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 的剖析页面了解详情。