Об обработчиках
Используйте обработчик для определения ситуаций, возникающих во время выполнения 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. |
Например, обработчик Reporting запуска добавляет следующий код в начало файла 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 начат. |
: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_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 завершил синхронизацию кулинарных книг. |
: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 завершил загрузку пользовательских ресурсов. |
: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 завершил загрузку рецептов. |
:converge_start |
Начата фаза сходимости выполнения Chef Infra Client. |
: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_current_state_load_bypassed |
Текущее состояние ресурса не загружено, так как ресурс не поддерживает режим why-run. |
:resource_bypassed |
Действие над ресурсом пропущено, так как ресурс не поддерживает режим why-run. |
:resource_update_applied |
Произведено изменение ресурса. (Это событие происходит для каждого изменения, внесенного в ресурс.) |
: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. |
:run_completed |
Выполнение Chef Infra Client завершено. |
:run_failed |
Выполнение Chef Infra Client завершилось ошибкой. |
: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 Infra Client.
chef_handler
Обработчики исключений и отчетов могут быть распространены с помощью кулинарной книги chef_handler. Эта кулинарная книга написана и поддерживается Chef и предоставляет пользовательский ресурс, который может использоваться для включения пользовательских обработчиков из рецептов и для включения обработчиков, специфичных для продукта, из кулинарных книг. Кулинарную книгу chef_handler можно получить здесь: https://github.com/chef-cookbooks/chef_handler. См. README.md для дополнительной информации.
Клиент Chef Infra
Обработчики запуска могут быть распространены с помощью кулинарной книги chef-client, которая установит обработчик на целевой узел во время начальной конфигурации узла. Это гарантирует, что обработчик запуска всегда присутствует на узле, чтобы он был доступен клиенту Chef Infra в начале каждого выполнения.
Пользовательские обработчики
Можно создать пользовательский обработчик для поддержки любой ситуации. Самый простой способ создания пользовательского обработчика:
- Загрузить кулинарную книгу 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 перед выполнением интерфейса 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 для отслеживания контекста выполнения; предоставляет доступ к свойствам 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, приложение, которое собирает данные и агрегирует их для проверки. |
| Асинхронные ресурсы | Обработчик, который асинхронно отправляет данные о исключениях и обработчиках отчетов в очередь STOMP, из которой данные могут быть обработаны и сохранены в хранилище данных. |
| Campfire | Обработчик, который собирает данные о исключениях и обработчиках отчетов и отправляет их в Campfire, веб-сервис группового чата. |
| Datadog | Обработчик, который собирает статистику Chef Infra Client и отправляет её в ленту новостей Datadog. |
| Flowdock | Обработчик, который собирает данные об исключениях и обработчиках отчетов и отправляет их пользователям через API Flowdock. |
| Graphite | Обработчик, который собирает данные о исключениях и обработчиках отчетов и отправляет их в Graphite, графическую программу визуализации данных. |
| Graylog2 GELF | Обработчик, который предоставляет состояние исключений и обработчиков отчетов (включая изменения) серверу Graylog2, чтобы данные можно было просмотреть с использованием формата Graylog Extended Log (GELF). |
| Growl | Обработчик, который собирает данные об исключениях и обработчиках отчетов, а затем отправляет их в виде уведомления Growl. |
| HipChat | Обработчик, который собирает данные об обработчиках исключений и отправляет их в HipChat, облачный сервис частного чата для компаний и команд. |
| IRC Snitch | Обработчик, который уведомляет администраторов (через Internet Relay Chat (IRC)) о сбоях выполнения Chef Infra Client. |
| Journald | Обработчик, который записывает запись в журнал systemd со статусом выполнения Chef Infra Client, подробностями исключения, настраиваемым приоритетом и пользовательскими деталями. |
| net/http | Обработчик, который сообщает о состоянии выполнения Chef в любой API через net/HTTP. |
| Простой email | Обработчик, который собирает данные об исключениях и обработчиках отчетов, а затем использует pony для отправки email-отчетов, основанных на шаблонах Erubis. |
| Обработчик почты SendGrid | Обработчик Chef, который собирает данные об исключениях и обработчиках отчетов, а затем использует SendGrid Ruby gem для отправки email-отчетов, основанных на шаблонах Erubis. |
| SNS | Обработчик, который уведомляет об исключениях и данных обработчиков отчетов и отправляет их в тему SNS. |
| Slack | Обработчик для отправки уведомлений о выполнении Chef Infra Client в канал Slack. |
| Splunk Storm | Обработчик, поддерживающий исключения и отчеты для Splunk Storm. |
| Syslog | Обработчик, который записывает основную важную информацию, такую как успех или неудача выполнения Chef Infra Client. |
| Обновленные ресурсы | Обработчик, который предоставляет простой способ отображения ресурсов, обновленных во время выполнения 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/