Исключение при выходе
Я пишу рецепт шеф-повара, как показано ниже. Я надеюсь, что рецепт может прекратить выполнение ресурсов после этого, но без исключения.
Есть ли у вас какие-либо идеи по этому поводу, кроме выполнения exit (0)?
ruby_block "verify #{current_container_name}" do
block do
require "docker"
begin
container = Docker::Container.get(current_container_name)
rescue Docker::Error::NotFoundError => exception
container = nil
end
if container.nil?
exit(0)
end
end
end
2 ответа
Вы могли бы использовать ignore_failure true
в этом рубиновом блоке вместо обработки исключения. Таким образом, он по-прежнему будет выводить сообщения об ошибках, но не будет воспринимать его как сбой, поэтому продолжит выполнение последующих ресурсов.
Если вы хотите прервать работу шеф-повара при особых обстоятельствах - например, текущий Docker-контейнер недоступен - это невозможно. Решение состоит в том, чтобы переосмыслить вашу проблему - вы хотите, чтобы какой-то код выполнялся только при выполнении специального условия.
Вы делаете это либо оставляя рецепт (с return true
), инкапсулируя ваши шаги конфигурации в условное предложение (например, if my_container.nil? then ... end
) или вы используете атрибуты узла, чтобы пройти через условия.
Допустим, ваша кулинарная книга x основана на трех рецептах, 1, 2 и 3. Так что, если вы хотите определить, что 2 и 3 запускаются, только если 1 был успешным, вы можете записать состояние первого рецепта в атрибуты узла (например, node.normal['recipe1'] = 'successful'
).
В других рецептах вы определите входные ворота, такие как:
return true if node['recipe1'] != 'succesful'
Но имейте в виду, что если вы используете атрибуты узла, вам нужно использовать ruby_block
-ресурс (в основном) в конце вашего первого рецепта, потому что голый код рубина оценивается и запускается во время компиляции ресурса - что происходит до запуска конвергенции.