Chef handlers

Вступление

Все кто хотя бы немного знаком с chef знают, что прогонка chef-client делится на несколько стадий:

  • Стадия компиляции
  • Стадия выполнения рецептов
  • Стадия выполнения нотифаев
  • Хэндлеры

Нет необходимости подробно останавливаться на каждом этапе, подробнее можно почитать на этой странице.

Зачем нужны хэндлеры?

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

  • updated_resources — все ресурсы, которые обновились за эту прогонку шефа
  • all_resources — вообще все ресурсы, которые есть в шеф рецептах
  • exception — исключения
  • backtrace — бэктрейс
  • время начала, останова и время выполнения
  • success? и failed?
  • run_context

В этих методах сосредоточено куча информации, которую можно использовать.

Виды хэндлеров

Есть два основных вида хэндлеров — report и exception, о предназначении которых можно догадаться из названия. Exception срабатывает только когда run_status зафейлился, а в остальном это тот же самый report. Еще есть start хэндлер, который срабатывает перед прогонкой рецептов, но не уверен что стоит его активно использовать.

Как сделать хэндлер

Компания Chef для добавления хэндлеров предлагает использовать их кукбук chef_handler, который содержит одноименный ресурс. При помощи этого кукбука все что нам надо сделать это собрать подходящий gem или руби файл, а потом воспользоваться ресурсом:

chef_handler "Chef::Handler::JsonFile" do
      source "chef/handler/json_file"
      arguments :path => '/var/chef/reports'
      action :enable
end

Но мне кажется удобнее, если собираешь свой хэндлер, использовать библиотеки в шефе. Тогда достаточно просто обьявить нужный класс с методом report и вуаля:

require 'chef/handler'
 
class Chef
  class Handler
    class Cleaner< Chef::Handler
      def report

Таким образом нам не надо собирать жемы, достаточно заинклюдить рецепт с нужной библиотекой.