Is there a way to return from Chef recipe without rising an exception?
Say I have a long recipe. I want to add a ruby block to it's beginning which will check some condition (for example directory presence) and stop processing this recipe (but continue to execute the rest of run_list) without raising an exception if condition succeeds.
Conditional execution (only_if/not_if) doesn't solve the problem because I have to add the condition to every resource call in the recipe while there may be very many of them.
There is a comment in Opscode's wiki where the commenter asks about the same but no answer.
The way to abort run of a recipe (e.g. due to some condition) is to use a 'return' statement. A thorough discussion appears in jtimberman's answer to a parallel StackOverflow question.
I would break up that recipe into two pieces and use
include_recipe
inside an if statement. For example incookbooks/foo/default.rb
:Put your conditional recipe in
cookbooks/foo/recipes/conditional_bit.rb
and addrecipe[foo]
to the appropriate node's run list.Note that the order of execution will be slightly different to if you had specified a ruby block. The condition will be checked during the "compile" phase of the chef-client run, not the "execute" phase. See the Anatomy of a Chef Run page for details.