Назад | Перейти на главную страницу

Вернуться из рецепта от шеф-повара без исключения

Есть ли способ вернуться из 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, а не на этапе "выполнения". Увидеть Анатомия шеф-повара страницу для подробностей.