我正在阅读client.log
文件,并将任何错误输出到客户端上的另一个txt文件。然后我正在检查该文件是否包含任何内容,如果是,我创建了一个错误。此功能非常好。我的问题是我必须把我的食谱作为厨师运行的最后一个食谱。这是一个问题,因为如果确实发生了错误,那么我的配方就不会运行,因为并非所有错误都会在异常中捕获。我现在正试图在启动处理程序中运行我的食谱,这样它将捕获上一次运行的错误,这很好。但我无法使启动处理程序正常工作。
我在一本厨师书中跟随了一个例子。当我重新启动chef-client服务时,我收到错误“Windows无法在本地计算机上启动Chef Client Service服务。错误1053服务没有及时响应启动或控制请求。”
这是我的处理程序代码
reqire "chef/handler"
class Chef
class Handler
class AwesomeStartHandler < Chef::Handler
def report
chef::Log.info("Handler executed")
end
end
end
end
这就是我被告知放在client.rb文件顶部的内容。
verify_api_cert true
require "path/awesome_start_handler.rb"
example_start_handler = Chef::Handler::AwesomeStartHandler.new
start_handlers << example_start_handler
以下代码适用于client.rb,但是一旦取消注释require,我就会得到相同的错误消息。 exception_handlers确实创建了一个失败的run-data.json,它确实包含了错误,但由于我编写的代码将使用启动处理程序,所以如果我能使用它,那就更好了。
#require 'path/awesome_start_handler.rb'
#start_handlers << Chef::Handler::AwesomeStartHandler.new()
require 'chef/handler/error_report'
report_handlers << Chef::Handler::ErrorReport.new()
exception_handlers << Chef::Handler::ErrorReport.new()
答案 0 :(得分:0)
即使它不会很长,也值得回答:
根据this part of chef documentation,可以随时加载报表处理程序,它通常在开头加载,但这不是强制性的。
报表处理程序将能够解析run_status属性以获取更新/失败的资源,这些资源不会停止大厨(没有异常引发),在引发异常时将调用错误处理程序。
您可以编写一个处理这两者的自定义处理程序,它必须根据report
返回值定义在run_status.failed?
方法中要执行的操作。
上面链接的文档有很多来自现有处理程序的例子,这是编写自己的处理程序的良好起点。
评论和问题编辑后的精确度:
您描述的方式是从client.rb
文件加载报表处理程序的历史方法。
启动处理程序是一个特定的启动处理程序,并在名为client.rb
的{{1}}中有自己的设置。有关如何配置启动处理程序的官方文档,请参阅there。根据你的一条评论,驱动chef_client食谱的属性听起来是最好的选择。