Исключение при выходе

Я пишу рецепт шеф-повара, как показано ниже. Я надеюсь, что рецепт может прекратить выполнение ресурсов после этого, но без исключения.

Есть ли у вас какие-либо идеи по этому поводу, кроме выполнения 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-ресурс (в основном) в конце вашего первого рецепта, потому что голый код рубина оценивается и запускается во время компиляции ресурса - что происходит до запуска конвергенции.

Другие вопросы по тегам