有没有办法在不引发异常的情况下从 Chef 食谱返回?
假设我有一个很长的食谱。我想在它的开头添加一个 ruby 块,它将检查某些条件(例如目录存在)并停止处理此配方(但继续执行 run_list 的其余部分),如果条件成功则不引发异常。
条件执行(only_if/not_if)不能解决问题,因为我必须将条件添加到配方中的每个资源调用,而它们可能有很多。
Opscode 的 wiki 中有一条评论,其中评论者询问了相同但没有答案。
有没有办法在不引发异常的情况下从 Chef 食谱返回?
假设我有一个很长的食谱。我想在它的开头添加一个 ruby 块,它将检查某些条件(例如目录存在)并停止处理此配方(但继续执行 run_list 的其余部分),如果条件成功则不引发异常。
条件执行(only_if/not_if)不能解决问题,因为我必须将条件添加到配方中的每个资源调用,而它们可能有很多。
Opscode 的 wiki 中有一条评论,其中评论者询问了相同但没有答案。
中止配方运行的方法(例如由于某些条件)是使用“返回”语句。彻底的讨论出现在 jtimberman 对平行 StackOverflow 问题的回答中。
我会将该食谱分成两部分并
include_recipe
在 if 语句中使用。例如在cookbooks/foo/default.rb
:将您的条件配方放入
cookbooks/foo/recipes/conditional_bit.rb
并添加recipe[foo]
到相应节点的运行列表中。请注意,如果您指定了 ruby 块,执行顺序将略有不同。将在 chef-client 运行的“编译”阶段检查条件,而不是“执行”阶段。有关详细信息,请参阅Chef Run 剖析页面。