Ресурс chef_handler
Эта страница сгенерирована из исходного кода Chef. Чтобы предложить изменение, отредактируйте файл chef_handler.rb и отправьте заявку на включение изменений в репозиторий Chef.
Используйте ресурс chef_handler для включения обработчиков во время выполнения Chef Infra Client. Этот ресурс позволяет передавать аргументы в Chef Infra Client, который затем применяет условия, определенные пользовательским обработчиком, к данным атрибутов узла, собранным во время выполнения Chef Infra Client, а затем обрабатывает обработчик на основе этих данных. Ресурс chef_handler обычно определяется в начале списка задач узла (часто как первый элемент). Это гарантирует, что все обработчики будут доступны на протяжении всего выполнения Chef Infra Client.
Новое в Chef Infra Client 14.0.
Типы обработчиков
Существует три типа обработчиков:
| Обработчик | Описание |
|---|---|
| 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 или путем установки драгоценного камня, содержащего обработчик запуска, с помощью ресурса 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
Запуск
Обработчик запуска не загружается в выполнение 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 можно настроить для автоматической установки и настройки драгоценных камней, необходимых обработчику запуска. Например:
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'
Синтаксис
Блок ресурса chef_handler включает обработчики во время выполнения chef-client. Два обработчика—JsonFile и ErrorReport—встроены в Chef:
chef_handler 'Chef::Handler::JsonFile' do
source 'chef/handler/json_file'
arguments :path => '/var/chef/reports'
action :enable
end
и:
chef_handler 'Chef::Handler::ErrorReport' do
source 'chef/handler/error_report'
action :enable
end
показывают, как включить эти обработчики в рецепте.
Полный синтаксис для всех свойств, доступных для ресурса chef_handler:
chef_handler 'name' do
arguments Array, Hash
class_name String # default value: 'name' unless specified
source String
type Hash # default value: {"report"=>true, "exception"=>true}
action Symbol # defaults to :enable if not specified
endгде:
-
chef_handler— это ресурс. -
name— имя, заданное для блока ресурса. -
actionопределяет, какие действия Chef Infra Client предпримет, чтобы привести узел в желаемое состояние. -
arguments,class_name,source, иtype— доступные свойства этого ресурса.
Действия
Ресурс chef_handler имеет следующие действия:
:disable- Отключить обработчик для текущего выполнения chef-client на текущем узле.
:enable- Включить обработчик для текущего выполнения chef-client на текущем узле.
:nothing- Этот блок ресурса не выполняет действий, пока не получит уведомление от другого ресурса. После получения уведомления этот блок ресурса либо выполняется немедленно, либо помещается в очередь для выполнения в конце выполнения Chef Infra Client.
Свойства
Ресурс chef_handler имеет следующие свойства:
arguments-
Тип Ruby: Массив, Хэш
Массив аргументов, передаваемых в инициализатор класса обработчика. Например:
arguments :key1 => 'val1'или:
arguments [:key1 => 'val1', :key2 => 'val2']
class_name-
Тип Ruby: Строка | Значение по умолчанию:
The resource block's nameИмя класса обработчика. Может быть с использованием пространств имен модулей.
source-
Тип Ruby: Строка
Полный путь к файлу обработчика. Также может быть путем драгоценного камня, если обработчик поставляется в составе драгоценного камня Ruby.
type-
Тип Ruby: Хэш | Значение по умолчанию:
{"report"=>true, "exception"=>true}Тип обработчика для регистрации, т.е. :report, :exception или оба.
Общие функциональные возможности ресурсов
Ресурсы Chef включают общие свойства, уведомления и блокировки ресурсов.
Общие свойства
Следующие свойства являются общими для всех ресурсов:
compile_time-
Тип Ruby: true, false | Значение по умолчанию:
falseУправление фазой, в которой ресурс выполняется на узле. Установите в значение true, чтобы запустить ресурс во время построения коллекции ресурсов (фаза
compile phase). Установите в значение false, чтобы запустить ресурс во время настройки узла Chef Infra Client (фазаconverge phase). ignore_failure-
Тип Ruby: true, false, :quiet | Значение по умолчанию:
falseПродолжение выполнения рецепта, если ресурс завершился неудачно по любой причине.
:quietне отобразит полный стек вызовов, и рецепт продолжит выполнение, если ресурс завершился неудачно. retries-
Тип Ruby: Целое число | Значение по умолчанию:
0Количество попыток перехвата исключений и повторной попытки выполнения ресурса.
retry_delay-
Тип Ruby: Целое число | Значение по умолчанию:
2Задержка повторной попытки (в секундах).
sensitive-
Тип Ruby: true, false | Значение по умолчанию:
falseГарантирует, что конфиденциальные данные ресурса не будут записываться в журнал Chef InfraClient.
Уведомления
notifies-
Тип Ruby: Символ, 'Chef::Resource[String]'
Ресурс может уведомить другой ресурс о выполнении действия при изменении его состояния. Укажите
'resource[name]',:actionи:timer. Ресурс может уведомить несколько ресурсов; используйте инструкциюnotifiesдля каждого уведомляемого ресурса.Если указанный ресурс не существует, генерируется ошибка. В отличие от
subscribes, он не потерпит неудачу, если исходный ресурс не найден.
Таймер определяет момент во время выполнения Chef Infra Client, когда выполняется уведомление. Доступны следующие таймеры:
:beforeУказывает, что действие над уведомленным ресурсом должно быть выполнено до обработки блока ресурса, в котором находится уведомление.
:delayedПо умолчанию. Указывает, что уведомление должно быть помещено в очередь и выполнено в конце выполнения Chef Infra Client.
-
:immediate,:immediately Указывает, что уведомление должно быть выполнено немедленно, для каждого уведомленного ресурса.
Синтаксис для notifies:
notifies :action, 'resource[name]', :timer
subscribesТип Ruby: Символ, 'Chef::Resource[String]'
Ресурс может слушать другой ресурс и затем предпринимать действие, если состояние прослушиваемого ресурса изменится. Укажите 'resource[name]', :action для выполнения, а затем :timer для этого действия.
Обратите внимание, что subscribes не применяет указанное действие к ресурсу, который он прослушивает — например:
file '/etc/nginx/ssl/example.crt' do
mode '0600'
owner 'root'
end
service 'nginx' do
subscribes :reload, 'file[/etc/nginx/ssl/example.crt]', :immediately
end
В этом случае свойство subscribes перезагружает службу nginx всякий раз, когда файл сертификата, расположенный по адресу /etc/nginx/ssl/example.crt, обновляется. subscribes не вносит никаких изменений в сам файл сертификата, а просто следит за изменениями файла и выполняет действие :reload для своего ресурса (в этом примере nginx), когда изменения обнаружены.
Если другого ресурса не существует, подписка не будет генерировать ошибку. Противопоставьте это более строгим семантикам notifies, которые генерируют ошибку, если другой ресурс не существует.
Таймер определяет момент во время выполнения Клиента Chef Infra, в котором выполняется уведомление. Доступны следующие таймеры:
:beforeУказывает, что действие над уведомлённым ресурсом должно быть выполнено до обработки блока ресурса, в котором находится уведомление.
:delayedПо умолчанию. Указывает, что уведомление должно быть помещено в очередь и затем выполнено в конце выполнения Клиента Chef Infra.
-
:immediate,:immediately Указывает, что уведомление должно быть выполнено немедленно, по каждому уведомлённому ресурсу.
Синтаксис для subscribes:
subscribes :action, 'resource[name]', :timer
Фильтры
Свойство фильтра может использоваться для оценки состояния узла во время фазы выполнения Клиента Chef Infra. На основании результатов этой оценки свойство фильтра затем используется для того, чтобы сообщить Клиенту Chef Infra, следует ли продолжать выполнение ресурса. Свойство фильтра принимает либо строковое значение, либо значение Ruby-блока:
- Строка выполняется как команда оболочки. Если команда возвращает
0, фильтр применяется. Если команда возвращает любое другое значение, то свойство фильтра не применяется. Строковые фильтры в powershell_script выполняют команды Windows PowerShell и могут возвращатьtrueв дополнение к0. - Блок выполняется как код Ruby, который должен вернуть либо
true, либоfalse. Если блок возвращаетtrue, свойство фильтра применяется. Если блок возвращаетfalse, свойство фильтра не применяется.
Свойство фильтра полезно для обеспечения идемпотентности ресурса, позволяя ресурсу проверить желаемое состояние по мере его выполнения, а затем, если желаемое состояние присутствует, Клиенту Chef Infra ничего не делать.
СвойстваСледующие свойства могут быть использованы для определения фильтра, который оценивается во время фазы выполнения Клиента Chef Infra:
not_ifПредотвращает выполнение ресурса, когда условие возвращает
true.only_ifРазрешает выполнение ресурса только в том случае, если условие возвращает
true.
Пользовательские обработчики
Можно создать пользовательский обработчик для поддержки любой ситуации. Самый простой способ создания пользовательского обработчика:
- Загрузите кулинарную книгу 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 доступна обработчику -
ModuleName— имя модуля, как оно существует в библиотекеChef -
HandlerName— имя обработчика, как оно используется в рецепте -
report— интерфейс, используемый для определения пользовательского обработчика
Например, ниже показан пользовательский обработчик, который отправляет электронное письмо, содержащее данные исключения, когда выполнение Клиента Chef Infra завершается неудачей:
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 используется для определения поведения обработчика и является обязательной частью любого пользовательского обработчика. Синтаксис интерфейса report следующий:
def report
# Ruby code
end
Код Ruby, используемый для определения пользовательского обработчика, будет сильно различаться в зависимости от обработчика. Клиент Chef Infra включает два обработчика по умолчанию: 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. Однако, следующие интерфейсы обычно не используются в обработчике и, в большинстве случаев, совершенно не нужны для правильной и/или желаемой работы обработчика.data
Метод data используется для возвращения представления Hash объекта run_status. Например:
def data
@run_status.to_hash
end
run_report_safely
Метод run_report_safely используется для запуска обработчика отчета, обрабатывая и регистрируя ошибки, которые могут возникнуть во время выполнения обработчика, и гарантируя, что все обработчики получат возможность запуститься во время выполнения Клиента Chef Infra (даже если некоторые обработчики завершатся ошибкой во время этого выполнения). В общем случае, этот метод никогда не должен использоваться как интерфейс в пользовательском обработчике, если только это поведение по умолчанию не нужно переопределить.
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 и будет содержать некоторые (или все) из следующих свойств:
| Свойство | Описание |
|---|---|
all_resources |
Список всех ресурсов, которые включены в свойство resource_collection для текущего выполнения Клиента Chef Infra. |
backtrace |
Стек вызовов, связанный с данными неперехваченного исключения, которые привели к неудаче выполнения Клиента Chef Infra, если он присутствует; nil для успешного выполнения Клиента Chef Infra. |
elapsed_time |
Время между началом (start_time) и окончанием (end_time) выполнения Клиента Chef Infra. |
end_time |
Время окончания выполнения Клиента Chef Infra. |
exception |
Данные неперехваченного исключения, которые привели к неудаче выполнения Клиента Chef Infra; nil для успешного выполнения Клиента Chef Infra. |
failed? |
Указывает, что выполнение Клиента Chef Infra завершилось неудачей, когда были подняты неперехваченные исключения во время выполнения Клиента Chef Infra. Обработчик исключений запускается, когда индикатор failed? имеет значение true |
node |
Узел, на котором произошло выполнение Клиента Chef Infra. |
run_context |
Экземпляр объекта Chef::RunContext; используется Клиентом Chef Infra для отслеживания контекста выполнения; предоставляет доступ к свойствам cookbook_collection, resource_collection, и definitions |
start_time |
Время начала выполнения Клиента Chef Infra. |
success? |
Указывает, что выполнение Клиента Chef Infra завершилось успешно, когда не было поднято неперехваченных исключений во время выполнения Клиента Chef Infra. Обработчик отчета запускается, когда индикатор success? имеет значение true |
updated_resources |
Список ресурсов, которые были помечены как обновлённые в результате выполнения Клиента Chef Infra. |
Примечание
Эти свойства не всегда доступны. Например, обработчик запуска выполняется в начале выполнения Клиента Chef Infra, что означает, что такие свойства, как end_time и elapsed_time всё ещё неизвестны и будут недоступны для объекта run_status.
Примеры
Следующие примеры демонстрируют различные подходы к использованию ресурса chef_handler в рецептах:
Включить обработчик ‘MyHandler’
Следующий пример демонстрирует, как включить вымышленный обработчик ‘MyHandler’, который находится на диске по адресу /etc/chef/my_handler.rb. Обработчик будет настроен для работы с Клиентом Chef Infra и получит значения для метода инициализации обработчика:
chef_handler 'MyHandler' do
source '/etc/chef/my_handler.rb' # the file should already be at this path
arguments path: '/var/chef/reports'
action :enable
end
Включить обработчики во время фазы компиляции
chef_handler 'Chef::Handler::JsonFile' do
source 'chef/handler/json_file'
arguments path: '/var/chef/reports'
action :enable
compile_time true
end
Обрабатывать только исключения
chef_handler 'Chef::Handler::JsonFile' do
source 'chef/handler/json_file'
arguments path: '/var/chef/reports'
type exception: true
action :enable
end
Версии кулинарных книг (пользовательский обработчик)
@juliandunn создал обработчик пользовательских отчетов, который регистрирует все кулинарные книги и версии кулинарных книг, которые использовались во время выполнения Chef Infra Client, а затем отчитывается после завершения выполнения.
cookbook_versions.rb:
Следующий пользовательский обработчик определяет, как кулинарные книги и версии кулинарных книг, которые используются во время выполнения Chef Infra Client, будут объединены в отчет с помощью класса Chef::Log в Chef Infra Client:
require 'chef/log'
module Chef
class CookbookVersionsHandler < Chef::Handler
def report
cookbooks = run_context.cookbook_collection
Chef::Log.info('Cookbooks and versions run: #{cookbooks.map {|x| x.name.to_s + ' ' + x.version }}')
end
end
end
default.rb:
Следующий рецепт добавляется в список выполнения для каждого узла, на котором будет сгенерирован список кулинарных книг и версий в качестве выходных данных отчета после каждого выполнения Chef Infra Client.
cookbook_file '/etc/chef/cookbook_versions.rb' do
source 'cookbook_versions.rb'
action :create
end
chef_handler 'Chef::CookbookVersionsHandler' do
source '/etc/chef/cookbook_versions.rb'
type report: true
action :enable
end
Этот рецепт сгенерирует выходные данные отчета, аналогичные следующему:
[2013-11-26T03:11:06+00:00] INFO: Chef Infra Client 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: ["cookbook_versions_handler 1.0.0"]
[2013-11-26T03:11:06+00:00] INFO: Report handlers complete
Обработчик JsonFile
Обработчик JsonFile доступен из кулинарной книги 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
После выполнения данные о состоянии выполнения можно загрузить и просмотреть с помощью интерактивного 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
Зарегистрировать обработчик JsonFile
chef_handler 'Chef::Handler::JsonFile' do
source 'chef/handler/json_file'
arguments path: '/var/chef/reports'
action :enable
end
Обработчик ErrorReport
Обработчик ErrorReport встроен в 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 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/resources/chef_handler/