О обработчиках
Используйте обработчик для определения ситуаций, возникающих во время выполнения 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 в начале каждого запуска.
Пользовательские обработчики
Можно создать пользовательский обработчик для поддержки любых ситуаций. Самый простой способ создать пользовательский обработчик:
- Скачайте кулинарию chef_handler
- Создайте пользовательский обработчик
- Напишите рецепт с использованием ресурса chef_handler
- Добавьте этот рецепт в список выполнения узла, часто в качестве первого рецепта в этом списке
Синтаксис
Синтаксис обработчика может различаться в зависимости от ситуаций, которые он отслеживает, типа используемого обработчика и т. д. Все пользовательские обработчики исключений и отчетов определяются с помощью 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.
Примечание
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/