【发布时间】:2021-02-02 12:31:01
【问题描述】:
我有一些我似乎无法找到解决方案的 catch-22。我可以成功地做到这一点:
#
# Cookbook:: core_unix_base_cmcb
# Recipe:: email_on_fail
email_hash = node.default['core_unix_base_cmcb']['email_hash']
email_hash['mailserver'] = node['postfix']['main']['relayhost']
email_hash['subject'] = "Subject: Chef-client run failed on #{email_hash['hostname']}"
email_hash['message'] = "A Chef-client run failed on #{email_hash['hostname']}."
email_hash['recipient'] = [ 'someone@somewhere.com' ]
Chef.event_handler do
on :run_failed do
SendEmail::Helper.new.send_email(email_hash)
end
end
require 'net/smtp'
module SendEmail
class Helper
def send_email(email_hash)
msg = "From: #{email_hash[:sender]} < #{email_hash[:sender]}@#{email_hash[:hostname]}\n"
msg << "To: #{email_hash[:recipient].join('; ')}\n"
msg << "#{email_hash[:subject]}\n"
msg << "Date: #{Time.now.rfc2822}\n\n"
msg << "#{email_hash[:message]}\n"
sender = 'chef-client-noreply@somewhere.com'
Net::SMTP.start(email_hash[:mailserver], 25) do |smtp|
smtp.send_message msg, sender, email_hash[:recipient]
end
end
end
end
但是 - 我需要包含 chef-client run_status 的消息。 如果你添加
msg << "#{run_status.formatted_exception}\n"
msg << Array(backtrace).join('\n')
对于上面的例子,run_status 没有定义。
我能找到的唯一示例是使用报告接口的自定义处理程序和 chef_handler 资源声明。所以我尝试了这个(来自我发现的一个例子):
chef_handler 'SendEmailOnFail::SendEmail' do # Full class name
# relative path to your handler
source ::File.expand_path('../../files/default/handlers/email_on_fail_helper.rb', __FILE__)
# source 'email_on_fail_helper.rb'
arguments email_hash # Hash or Array to pass to handler constructor
end
require 'net/smtp'
module SendEmailOnFail
class SendEmail < Chef::Handler
def report(email_hash)
if run_status.failed?
msg = "From: #{email_hash[:sender]} < #{email_hash[:sender]}@#{email_hash[:hostname]}\n"
msg << "To: #{email_hash[:recipient].join('; ')}\n"
msg << "#{email_hash[:subject]}\n"
msg << "Date: #{Time.now.rfc2822}\n\n"
msg << "#{email_hash[:message]}\n"
msg << "#{run_status.formatted_exception}\n"
msg << Array(backtrace).join('\n')
sender = 'chef-client-noreply@somewhere.com'
Net::SMTP.start(email_hash[:mailserver], 25) do |smtp|
smtp.send_message msg, sender, email_hash[:recipient]
end
end
end
end
end
当您使用该代码运行 chef-client 时,它会在参数上出错(收到 1,预期为 0)。 我在网上绝对没有找到 def 报告有任何参数的例子,所以我认为这就是问题所在。我们的组织需要这些参数,因为邮件服务器并不总是相同,收件人也不总是相同。
那么,如何在电子邮件正文中获取厨师客户端运行失败的信息,并将参数传递给库(或自定义处理程序)? 提前致谢。
【问题讨论】:
标签: chef-infra