Spec-Zone.ru › Chef 18

О обработчиках

[редактировать на GitHub]

Используйте обработчик для определения ситуаций, возникающих во время выполнения Chef Infra Client, и затем укажите Chef Infra Client, как обрабатывать эти ситуации при их возникновении.

Существует три типа обработчиков:

Обработчик Описание
exception Обработчик исключений используется для определения ситуаций, приведших к сбою выполнения Chef Infra Client. Обработчик исключений может быть загружен в начале выполнения Chef Infra Client путем добавления рецепта, содержащего ресурс chef_handler, в список выполнения узла. Обработчик исключений выполняется, когда свойство failed? объекта run_status возвращает значение true.
report Обработчик отчетов используется, когда выполнение Chef Infra Client завершается успешно, и сообщает о некоторых деталях этого выполнения. Обработчик отчетов может быть загружен в начале выполнения Chef Infra Client путем добавления рецепта, содержащего ресурс chef_handler, в список выполнения узла. Обработчик отчетов выполняется, когда свойство success? объекта run_status возвращает значение true.
start Обработчик запуска используется для выполнения событий в начале выполнения Chef Infra Client. Обработчик запуска может быть загружен в начале выполнения Chef Infra Client путем добавления обработчика запуска к настройке start_handlers в файле client.rb или путем установки gem, содержащего обработчик запуска, с помощью ресурса chef_gem в рецепте в кулинарии chef-client. (Обработчик запуска не может быть загружен с помощью ресурса chef_handler)

Обработчики исключений/отчетов

Обработчики исключений и отчетов используются для запуска определенного поведения в ответ на определенные ситуации, обычно выявляемые во время выполнения Chef Infra Client.

  • Обработчик исключений используется для запуска поведения при сбое определенного аспекта выполнения Chef Infra Client.
  • Обработчик отчетов используется для запуска поведения при успешном выполнении определенного аспекта выполнения Chef Infra Client.

Оба типа обработчиков могут использоваться для сбора данных о выполнении Chef Infra Client и могут предоставлять богатые данные обо всех типах использования, которые могут быть использованы позже для анализа тенденций и анализа во всей организации.

Обработчики исключений и отчетов предоставляются для выполнения Chef Infra Client одним из следующих способов:

  • Добавив ресурс chef_handler в рецепт, а затем добавив этот рецепт в список выполнения для узла. (Ресурс chef_handler доступен из кулинарии chef_handler.)
  • Добавив обработчик в одну из следующих настроек в файле client.rb узла: exception_handlers и/или report_handlers

Запуск из рецептов

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

Чтобы использовать ресурс chef_handler в рецепте, добавьте код, аналогичный следующему:

chef_handler 'name_of_handler' do
  source '/path/to/handler/handler_name'
  action :enable
end

Например, обработчик Growl должен быть включен в начале выполнения Chef Infra Client:

chef_gem 'chef-handler-growl'

а затем активируется в рецепте с помощью ресурса chef_handler:

chef_handler 'Chef::Handler::Growl' do
  source 'chef/handler/growl'
  action :enable
end

Запуск из client.rb

Простой обработчик исключений или отчетов может быть установлен и настроен во время выполнения. Это требует редактирования файла client.rb узла для добавления соответствующей настройки и информации об этом обработчике в файлы client.rb или solo.rb. В зависимости от типа обработчика необходимо добавить одну (или несколько) из следующих настроек:

Настройка Описание
exception_handlers Список обработчиков исключений, доступных для Chef Infra Client во время выполнения Chef Infra Client.
report_handlers Список обработчиков отчетов, доступных для Chef Infra Client во время выполнения Chef Infra Client.

При использовании этого подхода файл client.rb также должен сообщить Chef Infra Client, как установить и запустить обработчик. Нет стандартного места установки обработчиков. Самый простой способ их распространения и установки — через RubyGems, хотя также подойдут и другие методы, такие как GitHub или HTTP. После установки обработчика на систему его необходимо включить в файле client.rb, подключив его. После установки обработчик может потребовать дополнительной настройки. Это будет зависеть от обработчика. Если обработчик очень простой, может потребоваться только создание нового экземпляра. Например, если обработчик под названием MyOrg::EmailMe жестко закодирован для всех значений, необходимых для отправки электронного письма, требуется новый экземпляр. А затем пользовательский обработчик должен быть связан с каждым типом обработчика, для которого он будет работать.

Например:

require '/var/chef/handlers/email_me'         # the installation path

email_handler = MyOrg::EmailMe.new            # a simple handler

start_handlers << email_handler               # run at the start of the run
report_handlers << email_handler              # run at the end of a successful run
exception_handlers << email_handler           # run at the end of a failed run

Обработчики запуска

Обработчик запуска не загружается в выполнение Chef Infra Client из рецепта, а вместо этого перечисляется в файле client.rb с помощью атрибута start_handlers. Обработчик запуска должен быть установлен на узле и доступен для Chef Infra Client до начала выполнения Chef Infra Client. Используйте кулинарию chef-client для установки обработчика запуска.

Обработчики запуска предоставляются для выполнения Chef Infra Client одним из следующих способов:

  • Добавив обработчик запуска в кулинарию chef-client, которая устанавливает обработчик на узел, чтобы он был доступен Chef Infra Client в начале выполнения Chef Infra Client
  • Добавив обработчик в одну из следующих настроек в файле client.rb узла: start_handlers

Запуск из рецептов

Кулинария chef-client может быть настроена на автоматическую установку и настройку gem, необходимых для обработчика запуска. Например:

node.override['chef_client']['load_gems']['chef-reporting'] = {
  require_name: 'chef_reporting',
  action: :install,
}

node.override['chef_client']['config']['start_handlers'] = [
  {
    class: 'Chef::Reporting::StartHandler',
    arguments: [],
  },
]

include_recipe 'chef-client::config'

Запуск из client.rb

Обработчик запуска можно настроить в файле client.rb, добавив следующую настройку:

Настройка Описание
start_handlers Список обработчиков запуска, доступных для Chef Infra Client в начале выполнения Chef Infra Client.

Например, обработчик запуска отчетов добавляет следующий код в начало файла client.rb:

begin
  require 'chef_reporting'
  start_handlers << Chef::Reporting::StartHandler.new()
rescue LoadError
  Chef::Log.warn 'Failed to load #{lib}. This should be resolved after a chef run.'
end

Это гарантирует, что при запуске выполнения Chef Infra Client обработчик событий chef_reporting включен. Обработчик событий chef_reporting является частью gem под названием chef-reporting. Для установки этого gem используется ресурс chef_gem:

chef_gem 'chef-reporting' do
  action :install
end

Обработчики событий

Используйте DSL обработчика для добавления обратного вызова к событию. Если событие происходит во время выполнения Chef Infra Client, связанный обратный вызов выполняется. Например:

  • Отправка электронного письма, если выполнение Chef Infra Client завершается сбоем
  • Агрегирование статистики о ресурсах, обновленных во время выполнения Chef Infra Client, в StatsD

Метод on

Используйте метод on для связывания типа события с обратным вызовом. Обратный вызов определяет шаги, выполняемые, если событие происходит во время выполнения Chef Infra Client, и определяется произвольным кодом Ruby. Синтаксис следующий:

Chef.event_handler do
  on :event_type do
    # some Ruby
  end
end

где

  • Chef.event_handler объявляет блок кода в рецепте, который обрабатывается при возникновении указанного события во время выполнения Chef Infra Client
  • on определяет блок кода, который укажет Chef Infra Client, как обработать событие
  • :event_type — это допустимый тип события исключения, например :run_start, :run_failed, :converge_failed, :resource_failed, или :recipe_not_found

Например:

Chef.event_handler do
  on :converge_start do
    puts "Ohai! I have started a converge."
  end
end

Типы событий

В следующей таблице описаны события, которые могут произойти во время выполнения Chef Infra Client. Каждое из этих событий может быть указано в блоке метода on путем объявления его в качестве типа события.

Событие Описание
:run_start Начало выполнения Chef Infra Client.
:run_started Запуск Chef Infra Client начался.
:run_completed Завершение выполнения Chef Infra Client.
:run_failed Выполнение Chef Infra Client завершилось с ошибкой.
:ohai_completed Завершение выполнения Ohai.
:skipping_registration Chef Infra Client не регистрируется на Chef Infra Server, так как у него уже есть закрытый ключ или он в нём не нуждается.
:registration_start Chef Infra Client пытается создать закрытый ключ для регистрации на Chef Infra Server.
:registration_completed Chef Infra Client успешно создал закрытый ключ.
:registration_failed Chef Infra Client столкнулся с ошибкой и не смог зарегистрироваться на Chef Infra Server.
:node_load_start Chef Infra Client пытается загрузить данные узла с Chef Infra Server.
:node_load_success Chef Infra Client успешно загрузил данные узла из модуля политики.
:node_load_failed Chef Infra Client столкнулся с ошибкой и не смог загрузить данные узла с Chef Infra Server.
:run_list_expand_failed Chef Infra Client не смог расширить список выполнения.
:node_load_completed Chef Infra Client успешно загрузил данные узла с Chef Infra Server. Вычислены стандартные и переопределяющие атрибуты ролей, но они ещё не применены.
:policyfile_loaded Файл политики был загружен.
:cookbook_resolution_start Chef Infra Client пытается скачать набор кулинарных книг с Chef Infra Server.
:cookbook_resolution_failed Chef Infra Client не смог скачать набор кулинарных книг с Chef Infra Server.
:cookbook_resolution_complete Chef Infra Client успешно скачал набор кулинарных книг с Chef Infra Server.
:cookbook_clean_start Chef Infra Client пытается удалить ненужные кулинарные книги.
:removed_cookbook_file Chef Infra Client удалил файл из кулинарной книги.
:cookbook_clean_complete Chef Infra Client завершил удаление кулинарных книг и/или файлов кулинарных книг.
:cookbook_sync_start Chef Infra Client пытается синхронизировать кулинарные книги.
:synchronized_cookbook Chef Infra Client пытается синхронизировать указанную кулинарную книгу.
:updated_cookbook_file Chef Infra Client обновил указанный файл в указанной кулинарной книге.
:cookbook_sync_failed Chef Infra Client не смог синхронизировать кулинарные книги.
:cookbook_sync_complete Chef Infra Client завершил синхронизацию кулинарных книг.
:cookbook_gem_start Chef Infra Client собирает gem'ы из кулинарных книг.
:cookbook_gem_installing Chef Infra Client устанавливает gem кулинарной книги.
:cookbook_gem_using Chef Infra Client использует gem кулинарной книги.
:cookbook_gem_finished Chef Infra Client завершил установку gem кулинарных книг.
:cookbook_gem_failed Chef Infra Client не смог установить gem кулинарных книг.
:cookbook_compilation_start Chef Infra Client создал run_context и начал компиляцию кулинарных книг.
:library_load_start Chef Infra Client загружает файлы библиотек.
:library_file_loaded Chef Infra Client успешно загрузил указанный файл библиотеки.
:library_file_load_failed Chef Infra Client не смог загрузить указанный файл библиотеки.
:library_load_complete Chef Infra Client завершил загрузку файлов библиотек.
:lwrp_load_start Chef Infra Client загружает пользовательские ресурсы.
:lwrp_file_loaded Chef Infra Client успешно загрузил указанный пользовательский ресурс.
:lwrp_file_load_failed Chef Infra Client не смог загрузить указанный пользовательский ресурс.
:lwrp_load_complete Chef Infra Client завершил загрузку пользовательских ресурсов.
:ohai_plugin_load_start Ohai начал загрузку плагинов.
:ohai_plugin_file_loaded Ohai загрузил плагин.
:ohai_plugin_file_load_failed Ohai не смог загрузить плагин.
:ohai_plugin_load_complete Ohai завершил загрузку плагинов.
:attribute_load_start Chef Infra Client загружает файлы атрибутов.
:attribute_file_loaded Chef Infra Client успешно загрузил указанный файл атрибута.
:attribute_file_load_failed Chef Infra Client не смог загрузить указанный файл атрибута.
:attribute_load_complete Chef Infra Client завершил загрузку файлов атрибутов.
:definition_load_start Chef Infra Client загружает определения.
:definition_file_loaded Chef Infra Client успешно загрузил указанное определение.
:definition_file_load_failed Chef Infra Client не смог загрузить указанное определение.
:definition_load_complete Chef Infra Client завершил загрузку определений.
:recipe_load_start Chef Infra Client загружает рецепты.
:recipe_file_loaded Chef Infra Client успешно загрузил указанный рецепт.
:recipe_file_load_failed Chef Infra Client не смог загрузить указанный рецепт.
:recipe_not_found Chef Infra Client не смог найти указанный рецепт.
:recipe_load_complete Chef Infra Client завершил загрузку рецептов.
:cookbook_compilation_complete Chef Infra Client завершил все фазы компиляции кулинарных книг.
:converge_start Началась фаза слияния выполнения Chef Infra Client.
:action_collection_registration Предоставляет ссылку на коллекцию действий до компиляции кулинарных книг.
:converge_complete Фаза слияния выполнения Chef Infra Client завершена.
:converge_failed Фаза слияния выполнения Chef Infra Client завершилась с ошибкой.
:control_group_started Обрабатывается указанная группа управления.
:control_example_success Указанная группа управления обработана.
:control_example_failure Обработка указанной группы управления завершилась с ошибкой.
:resource_action_start Начинается действие ресурса.
:resource_skipped Действие ресурса пропущено.
:resource_current_state_loaded Загружено текущее состояние ресурса.
:resource_after_state_loaded Загружено состояние ресурса после выполнения.
:resource_current_state_load_bypassed Текущее состояние ресурса не было загружено, так как ресурс не поддерживает режим why-run.
:resource_bypassed Действие ресурса пропущено, так как ресурс не поддерживает режим why-run.
:resource_update_applied Внесены изменения в ресурс. (Это событие происходит для каждого изменения, внесенного в ресурс.)
:resource_update_progress Ресурс отправил уведомление о прогрессе пользователю, чтобы указать общий прогресс длительной операции.
:resource_failed_retriable Действие ресурса завершилось ошибкой и будет повторено.
:resource_failed Действие ресурса завершилось ошибкой и не будет повторено.
:resource_updated Ресурс требует изменения.
:resource_up_to_date Ресурс уже корректен.
:resource_completed Все действия для ресурса завершены.
:stream_opened Поток открыт.
:stream_closed Поток закрыт.
:stream_output Часть данных из отдельного потока с указанным именем.
:handlers_start Началась фаза обработки обработчика для выполнения Chef Infra Client.
:handler_executed Обработан указанный обработчик.
:handlers_completed Фаза обработки обработчика для выполнения Chef Infra Client завершена.
:provider_requirement_failed Произошел сбой утверждения, объявленного поставщиком.
:whyrun_assumption Произошел сбой утверждения, объявленного поставщиком, но выполнение разрешено продолжить, потому что Chef Infra Client работает в режиме why-run.
:deprecation Выведено сообщение о устаревании.
:attribute_changed Выводит все изменения атрибутов в кулинарных книгах или устанавливает политику, которая определяет, что переопределяющие атрибуты никогда не должны использоваться.

Примеры

В следующих примерах показаны способы использования DSL обработчика.

Отправка электронной почты

Используйте метод on для создания обработчика событий, который отправляет электронное письмо при сбое выполнения Chef Infra Client. Для этого потребуется:

  • Способ указать Chef Infra Client, как отправлять электронные письма
  • Обработчик событий, описывающий действия при срабатывании события :run_failed
  • Способ вызвать исключение и протестировать поведение обработчика событий
Настройка отправки электронной почты

Используйте библиотеку для определения кода, который отправляет электронное письмо при сбое выполнения Chef Infra Client. Назовите файл helper.rb и добавьте его в каталог /libraries кулинарной книги:

require 'net/smtp'

module HandlerSendEmail
  class Helper
    def send_email_on_run_failure(node_name)
      message = "From: Chef <chef@chef.io>\n"
      message << "To: Grant <grantmc@chef.io>\n"
      message << "Subject: Chef run failed\n"
      message << "Date: #{Time.now.rfc2822}\n\n"
      message << "Chef run failed on #{node_name}\n"
      Net::SMTP.start('localhost', 25) do |smtp|
        smtp.send_message message, 'chef@chef.io', 'grantmc@chef.io'
      end
    end
  end
end
Добавление обработчика

Вызовите вспомогательную функцию библиотеки в рецепте:

Chef.event_handler do
  on :run_failed do
    HandlerSendEmail::Helper.new.send_email_on_run_failure(
      Chef.run_context.node.name
    )
  end
end
  • Используйте Chef.event_handler для определения обработчика событий
  • Используйте метод on для указания типа события

Внутри блока on, укажите Chef Infra Client, как обрабатывать событие при его срабатывании.

Тестирование обработчика

Используйте следующий фрагмент кода для запуска исключения и отправки Chef Infra Client электронного письма на указанный адрес электронной почты:

ruby_block 'fail the run' do
  block do
    raise 'deliberately fail the run'
  end
end

Блокировки etcd

Следующий пример демонстрирует, как предотвратить одновременные запуски Chef Infra Client, чтобы ни один из них не удерживал блокировку в etcd:

lock_key = "#{node.chef_environment}/#{node.name}"

Chef.event_handler do
  on :converge_start do |run_context|
    Etcd.lock_acquire(lock_key)
  end
end

Chef.event_handler do
  on :converge_complete do
    Etcd.lock_release(lock_key)
  end
end

Уведомления HipChat

Сообщения об событиях могут быть отправлены в инструмент командной связи, такой как HipChat. Например, если запуск Chef Infra Client завершается ошибкой:

Chef.event_handler do
  on :run_failed do |exception|
    hipchat_notify exception.message
  end
end

или отправьте оповещение при изменении конфигурации:

Chef.event_handler do
  on :resource_updated do |resource, action|
    if resource.to_s == 'template[/etc/nginx/nginx.conf]'
      Helper.hipchat_message("#{resource} was updated by chef")
    end
  end
end

Обработчики и кулинарии

Следующие кулинарии могут быть использованы для загрузки обработчиков во время выполнения Chef InfraClient.

chef_handler

Обработчики исключений и отчетов могут быть распространены с помощью ресурса chef_handler. Этот ресурс включён в Chef 14 и выше. Он может быть использован для включения пользовательских обработчиков из рецептов и для включения обработчиков, специфичных для продукта, из кулинарий.

Для получения дополнительной информации см. документацию по ресурсу chef_handler Resource.

Chef Infra Client

Обработчики запуска могут быть распространены с помощью кулинарии chef-client, которая установит обработчик на целевой узел во время первоначальной конфигурации узла. Это гарантирует, что обработчик запуска всегда присутствует на узле, чтобы он был доступен Chef Infra Client в начале каждого запуска.

Пользовательские обработчики

Можно создать пользовательский обработчик для поддержки любых ситуаций. Самый простой способ создать пользовательский обработчик:

  1. Скачайте кулинарию chef_handler
  2. Создайте пользовательский обработчик
  3. Напишите рецепт с использованием ресурса chef_handler
  4. Добавьте этот рецепт в список выполнения узла, часто в качестве первого рецепта в этом списке

Синтаксис

Синтаксис обработчика может различаться в зависимости от ситуаций, которые он отслеживает, типа используемого обработчика и т. д. Все пользовательские обработчики исключений и отчетов определяются с помощью Ruby и должны быть подклассом класса Chef::Handler.

require 'chef/log'

module ModuleName
  class HandlerName < Chef::Handler
    def report
      # Ruby code goes here
    end
  end
end

где:

  • require гарантирует, что функциональность ведения журнала Chef Infra Client доступна для обработчика
  • ModuleName — имя модуля в библиотеке Chef
  • HandlerName — имя обработчика, используемого в рецепте
  • report — интерфейс, используемый для определения пользовательского обработчика

Например, следующий пример показывает пользовательский обработчик, отправляющий электронное письмо с данными исключения, когда запуск Chef Infra Client завершается ошибкой:

require 'net/smtp'

module OrgName
  class SendEmail < Chef::Handler
    def report
      if run_status.failed?
        message = "From: sender_name <sender@example.com>\n"
        message << "To: recipient_address <recipient@example.com>\n"
        message << "Subject: chef-client Run Failed\n"
        message << "Date: #{Time.now.rfc2822}\n\n"
        message << "Chef run failed on #{node.name}\n"
        message << "#{run_status.formatted_exception}\n"
        message << Array(backtrace).join('\n')
        Net::SMTP.start('your.smtp.server', 25) do |smtp|
          smtp.send_message message, 'sender@example', 'recipient@example'
        end
      end
    end
  end
end

и затем используется в рецепте так:

send_email 'blah' do
  # recipe code
end

Интерфейс отчета

Интерфейс report используется для определения поведения обработчика и является обязательной частью любого пользовательского обработчика. Синтаксис интерфейса report следующий:

def report
  # Ruby code
end

Ruby-код, используемый для определения пользовательского обработчика, будет сильно отличаться в зависимости от обработчика. Chef Infra Client включает два обработчика по умолчанию: error_report и json_file. Их использование интерфейса report показано ниже.

Обработчик error_report:

require 'chef/handler'
require 'chef/resource/directory'

class Chef
  class Handler
    class ErrorReport < ::Chef::Handler
      def report
        Chef::FileCache.store('failed-run-data.json', Chef::JSONCompat.to_json_pretty(data), 0640)
        Chef::Log.fatal("Saving node information to #{Chef::FileCache.load('failed-run-data.json', false)}")
      end
    end
  end
end

Обработчик json_file:

require 'chef/handler'
require 'chef/resource/directory'

class Chef
  class Handler
    class JsonFile < ::Chef::Handler
      attr_reader :config
      def initialize(config = {})
        @config = config
        @config[:path] ||= '/var/chef/reports'
        @config
      end

      def report
        if exception
          Chef::Log.error('Creating JSON exception report')
        else
          Chef::Log.info('Creating JSON run report')
        end
        build_report_dir
        savetime = Time.now.strftime('%Y%m%d%H%M%S')
        File.open(File.join(config[:path], 'chef-run-report-#{savetime}.json'), 'w') do |file|
          run_data = data
          run_data[:start_time] = run_data[:start_time].to_s
          run_data[:end_time] = run_data[:end_time].to_s
          file.puts Chef::JSONCompat.to_json_pretty(run_data)
        end
      end

      def build_report_dir
        unless File.exist?(config[:path])
          FileUtils.mkdir_p(config[:path])
          File.chmod(00700, config[:path])
        end
      end
    end
  end
end

Дополнительные интерфейсы

Следующие интерфейсы могут быть использованы в обработчике аналогично интерфейсу report для переопределения поведения обработчика по умолчанию в Chef Infra Client. Тем не менее, эти интерфейсы обычно не используются в обработчике и, по большей части, совершенно не нужны для корректной и/или желаемой работы обработчика.

data

Метод data используется для возврата представления Hash объекта run_status. Например:

def data
  @run_status.to_hash
end

run_report_safely

Метод run_report_safely используется для выполнения обработчика отчета, обрабатывая и регистрируя потенциальные ошибки, которые могут возникнуть во время работы обработчика, и гарантируя, что все обработчики получают возможность выполнения во время запуска Chef Infra Client (даже если некоторые обработчики завершатся ошибкой во время этого запуска). В общем случае этот метод не следует использовать в качестве интерфейса в пользовательском обработчике, если это поведение по умолчанию не нужно переопределить.

def run_report_safely(run_status)
  run_report_unsafe(run_status)
rescue Exception => e
  Chef::Log.error('Report handler #{self.class.name} raised #{e.inspect}')
  Array(e.backtrace).each { |line| Chef::Log.error(line) }
ensure
  @run_status = nil
end

run_report_unsafe

Метод run_report_unsafe используется для выполнения обработчика отчета без обработки ошибок. Этот метод не следует использовать напрямую ни в каком обработчике, кроме как при тестировании этого обработчика. Например:

def run_report_unsafe(run_status)
  @run_status = run_status
  report
end

Объект run_status

Объект run_status инициализируется Chef Infra Client перед запуском интерфейса report для любого обработчика. Объект run_status отслеживает состояние запуска Chef Infra Client и будет содержать некоторые (или все) из следующих свойств:

Свойство Описание
all_resources Список всех ресурсов, включённых в свойство resource_collection для текущего запуска Chef Infra Client.
backtrace Трассировка стека, связанная с неперехваченным исключением, вызвавшим сбой запуска Chef Infra Client, если таковое присутствует; nil для успешного запуска Chef Infra Client.
elapsed_time Время между началом (start_time) и окончанием (end_time) запуска Chef Infra Client.
end_time Время окончания запуска Chef Infra Client.
exception Неперехваченные данные исключения, вызвавшие сбой запуска Chef Infra Client; nil для успешного запуска Chef Infra Client.
failed? Показывает, что запуск Chef Infra Client завершился ошибкой, когда во время запуска Chef Infra Client были подняты неперехваченные исключения. Обработчик исключений запускается, когда индикатор failed? равен true.
node Узел, на котором произошёл запуск Chef Infra Client.
run_context Экземпляр объекта Chef::RunContext; используется Chef Infra Client для отслеживания контекста запуска; предоставляет доступ к свойствам cookbook_collection, resource_collection, и definitions.
start_time Время начала запуска Chef Infra Client.
success? Показывает, что запуск Chef Infra Client завершился успешно, когда во время запуска Chef Infra Client не было поднято неперехваченных исключений. Обработчик отчета запускается, когда индикатор success? равен true.
updated_resources Список ресурсов, отмеченных как обновлённые в результате запуска Chef Infra Client.

Примечание

Эти свойства не всегда доступны. Например, обработчик запуска выполняется в начале запуска Chef Infra Client, что означает, что такие свойства, как end_time и elapsed_time всё ещё неизвестны и недоступны для объекта run_status.

Примеры

В следующих разделах представлены примеры обработчиков.

Версии кулинарий

Пользователь сообщества juliandunn создал пользовательский обработчик отчетов, который регистрирует все кулинарии и версии кулинарий, которые были использованы во время запуска Chef Infra Client, а затем отчитывается после завершения запуска. Этот обработчик требует ресурса chef_handler (который доступен из кулинарии chef_handler).

cookbook_versions.rb

Следующий пользовательский обработчик определяет, как кулинарии и версии кулинарий, которые используются во время запуска Chef Infra Client, будут скомпилированы в отчёт с помощью класса Chef::Log в Chef Infra Client:

require 'chef/log'

module Opscode
  class CookbookVersionsHandler < Chef::Handler
    def report
      cookbooks = run_context.cookbook_collection
      Chef::Log.info('Cookbooks and versions run: #{cookbooks.keys.map {|x| cookbooks[x].name.to_s + ' ' + cookbooks[x].version} }')
    end
  end
end

default.rb

Следующий рецепт добавляется в список выполнения для каждого узла, на котором будет сгенерирован список кулинарий и версий в качестве отчёта после каждого запуска Chef Infra Client.

include_recipe 'chef_handler'

cookbook_file "#{node['chef_handler']['handler_path']}/cookbook_versions.rb" do
  source 'cookbook_versions.rb'
  owner 'root'
  group 'root'
  mode '0755'
  action :create
end

chef_handler 'Opscode::CookbookVersionsHandler' do
  source "#{node['chef_handler']['handler_path']}/cookbook_versions.rb"
  supports :report => true
  action :enable
end

Этот рецепт сгенерирует вывод отчёта, подобный следующему:

[2013-11-26T03:11:06+00:00] INFO: Chef Run complete in 0.300029878 seconds
[2013-11-26T03:11:06+00:00] INFO: Running report handlers
[2013-11-26T03:11:06+00:00] INFO: Cookbooks and versions run: ["chef_handler 1.1.4", "cookbook_versions_handler 1.0.0"]
[2013-11-26T03:11:06+00:00] INFO: Report handlers complete

Отчётность

Функциональность обработчика запуска была добавлена, когда Chef начал создавать дополнения для Chef Infra Server. Дополнение Отчётность предназначено для создания отчётных данных на основе запуска Chef Infra Client. Поскольку Отчётность должна собирать данные для всего запуска Chef Infra Client, Отчётность должна быть включена до того, как произойдёт что-либо ещё в начале запуска Chef Infra Client.

Примечание

Обработчик запуска, используемый дополнением Отчётность для Chef Infra Server, всегда устанавливается с помощью кулинарии chef-client.

start_handler.rb

Следующий код демонстрирует обработчик запуска, используемый дополнением Отчётность для Chef Infra Server:

require 'chef/handler'
require 'chef/rest'
require 'chef/version_constraint'

class Chef
  class Reporting
    class StartHandler < ::Chef::Handler
      attr_reader :config

      def initialize(config = {})
        @config = config
      end

      def report
        version_checker = Chef::VersionConstraint.new('< 11.6.0')
        if version_checker.include?(Chef::VERSION)
          Chef::Log.info('Enabling backported resource reporting Handler')
          rest = Chef::REST.new(Chef::Config[:chef_server_url], @run_status.node.name, Chef::Config[:client_key])
          resource_reporter = Chef::Reporting::ResourceReporter.new(rest)
          @run_status.events.register(resource_reporter)

          resource_reporter.run_started(@run_status)
        else
          Chef::Log.debug('Chef Version already has new Resource Reporter - skipping startup of backport version')
        end
      end
    end
  end
end

Обработчик json_file

Обработчик json_file доступен из кулинарии chef_handler и может использоваться с исключениями и отчётами. Он сериализует данные статуса выполнения в файл JSON. Этот обработчик может быть включён одним из следующих способов.

Добавив следующие строки Ruby-кода в файл client.rb или solo.rb в зависимости от того, как выполняется Chef Infra Client:

require 'chef/handler/json_file'
report_handlers << Chef::Handler::JsonFile.new(:path => '/var/chef/reports')
exception_handlers << Chef::Handler::JsonFile.new(:path => '/var/chef/reports')

Используя ресурс chef_handler в рецепте, примерно так:

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

После его выполнения данные статуса выполнения можно загрузить и просмотреть с помощью Interactive Ruby (IRb):

irb(main):002:0> require 'json' => true
irb(main):003:0> require 'chef' => true
irb(main):004:0> r = JSON.parse(IO.read('/var/chef/reports/chef-run-report-20110322060731.json')) => ... output truncated
irb(main):005:0> r.keys => ['end_time', 'node', 'updated_resources', 'exception', 'all_resources', 'success', 'elapsed_time', 'start_time', 'backtrace']
irb(main):006:0> r['elapsed_time'] => 0.00246

Обработчик error_report

Обработчик error_report встроен в Chef Infra Client и может использоваться для обработки как исключений, так и отчетов. Он сериализует данные отчета об ошибках в файл JSON. Данный обработчик можно включить несколькими способами.

Добавив следующие строки Ruby-кода в файл client.rb или solo.rb, в зависимости от того, как запущен Chef Infra Client:

require 'chef/handler/error_report'
report_handlers << Chef::Handler::ErrorReport.new()
exception_handlers << Chef::Handler::ErrorReport.new()

Используя ресурс chef_handler в рецепте, аналогично следующему:

chef_handler 'Chef::Handler::ErrorReport' do
  source 'chef/handler/error_report'
  action :enable
end

Обработчики сообщества

Из сообщества Chef доступны следующие обработчики с открытым исходным кодом:

Обработчик Описание
Airbrake Обработчик, который отправляет исключения (только) в Airbrake, приложение, которое собирает данные и агрегирует их для проверки.
Asynchronous Resources Обработчик, который асинхронно отправляет данные обработчика исключений и отчетов в очередь STOMP, откуда данные могут быть обработаны и сохранены.
Campfire Обработчик, который собирает данные обработчика исключений и отчетов и отправляет их в Campfire, веб-сервис для группового чата.
Datadog Обработчик, который собирает статистику Chef Infra Client и отправляет ее в новостную ленту Datadog.
Flowdock Обработчик, который собирает данные обработчика исключений и отчетов и отправляет их пользователям через API Flowdock.
Graphite Обработчик, который собирает данные обработчика исключений и отчетов и отправляет их в Graphite, приложение для графического отображения данных.
Graylog2 GELF Обработчик, который предоставляет статус исключений и обработчиков отчетов (включая изменения) серверу Graylog2, так что данные могут быть просмотрены с помощью Graylog Extended Log Format (GELF).
Growl Обработчик, который собирает данные обработчика исключений и отчетов и отправляет их как уведомление Growl.
HipChat Обработчик, который собирает данные обработчика исключений и отправляет их в HipChat, облачный сервис частного чата для компаний и команд.
IRC Snitch Обработчик, который уведомляет администраторов (через Internet Relay Chat (IRC)) о сбое выполнения Chef Infra Client.
Journald Обработчик, который записывает запись в системный журнал с результатом выполнения Chef Infra Client, подробностями исключения, конфигурируемым приоритетом и пользовательскими деталями.
net/http Обработчик, который сообщает о статусе выполнения Chef в любой API через net/HTTP.
Simple Email Обработчик, который собирает данные обработчика исключений и отчетов, а затем использует pony для отправки электронных отчетов на основе шаблонов `.erb` (Embedded Ruby).
SNS Обработчик, который уведомляет об исключениях и обработчиках отчетов и отправляет их на тему SNS.
Slack Обработчик для отправки уведомлений о выполнении Chef Infra Client в канал Slack.
Splunk Storm Обработчик, который поддерживает исключения и отчеты для Splunk Storm.
Syslog Обработчик, который записывает базовую необходимую информацию, например, о успешном или неудачном выполнении Chef Infra Client.
Updated Resources Обработчик, который предоставляет простой способ отображения ресурсов, которые были обновлены во время выполнения Chef Infra Client.
ZooKeeper Обработчик отчетов Chef для отправки уведомлений о выполнении Chef в ZooKeeper.

© Chef Software, Inc.
Licensed under the Creative Commons Attribution 3.0 Unported License.
The Chef™ Mark and Chef Logo are either registered trademarks/service marks or trademarks/servicemarks of Chef, in the United States and other countries and are used with Chef Inc's permission.
We are not affiliated with, endorsed or sponsored by Chef Inc.
https://docs.chef.io/handlers/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API