从厨师食谱返回,没有例外

有没有办法从厨师食谱回来,没有例外?

说我有一个很长的配方。 我想添加一个ruby块开始,这将检查一些条件(例如目录存在),并停止处理这个配方(但继续执行run_list的其余部分),而不会引发exception,如果条件成功。

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

在Opscode的wiki中有一个评论 ,评论者询问的是同样的答案。

中止配方运行的方式(例如,由于某些条件)是使用“返回”语句。 jtimberman的答案出现在一个并行的StackOverflow问题上 。

我会分解成两部分,并在if语句中使用include_recipe 。 例如在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块,那么执行的顺序会稍有不同。 在厨师 – 客户端运行的“编译”阶段将检查该条件,而不是“执行”阶段。 详情请看“ 厨师运行剖析”页面。