Есть ли способ вернуться из Chef recipe без исключения?
Скажем, у меня есть длинный рецепт. Я хочу добавить в начало рубиновый блок, который проверит какое-то условие (например, наличие каталога) и прекратит обработку этот recipe (но продолжить выполнение остальной части run_list) без создания исключения, если условие выполнено успешно.
Условное выполнение (only_if / not_if) не решает проблему, потому что мне нужно добавить условие в каждый вызов ресурса в рецепте, хотя их может быть очень много.
Eсть комментарий в вики Opscode, где комментатор спрашивает примерно то же самое, но не отвечает.
Способ прервать выполнение рецепта (например, из-за какого-либо условия) - использовать оператор return. Подробное обсуждение содержится в ответе jtimberman на параллельный вопрос StackOverflow.
Я бы разделил этот рецепт на две части и использовал 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]
в соответствующий список выполнения узла.
Обратите внимание, что порядок выполнения будет немного отличаться от того, если бы вы указали рубиновый блок. Условие будет проверяться на этапе "компиляции" выполнения программы chef-client, а не на этапе "выполнения". Увидеть Анатомия шеф-повара страницу для подробностей.