2015-04-27 208 views
2

我正在阅读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确实创建了一个failed-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

为什么不使用错误处理程序如果您的目的只是为了发现错误?如果出现错误(例外情况发生),只有厨师运行结束时才会触发它,厨师11.0(IIRC)报告和错误处理程序总是作为厨师分叉运行并由父进程管理。 – Tensibai

+0

我不确定是否在日志中收到错误或致命错误时总是抛出异常,但我被告知总是抛出异常,但并不总是被捕获。所以说什么可能会起作用。我究竟在哪里放置我的代码,这是我遇到的另一个问题,我有食谱chef_client和厨师处理程序。 – balex

+0

我在电话和链接上复制我们很辛苦,明天我会做一个更完整的答案,对于错误级别,报告处理程序是要走的路,它将能够处理资源失败,即使ignore_failure是真正。 – Tensibai

回答

0

值得即使它不会是很长的答案:

根据this part of chef documentation报告处理程序可以在任何时间被加载,它往往是加载在一开始,但是这不是强制性的。

报告处理程序将能够解析run_status属性的更新/失败的资源,它不会停止厨师(不会引发异常),当引发异常时会调用错误处理程序。

您可以编写一个处理两者的自定义处理程序,它将必须根据run_status.failed?返回值来定义在其report方法中要执行的操作。

以上链接的文档有很多来自现有处理程序的例子,这是编写自己的一个很好的起点。意见和问题编辑后


精密:

您所描述的方法是从client.rb文件加载报告处理历史的方式。

启动处理程序是一个特定的处理程序,并且在client.rb中有其自己的设置,名为start_handler。有关如何配置启动处理程序的官方文档,请参阅there。根据你的评论之一,驾驶chef_client食谱的属性听起来是最好的选择。

+0

虽然我最终可能最终会使用错误处理程序,但我希望启动处理程序能够工作,如果有人能够帮助,因为我已经编写了代码并且能够捕获最后一位厨师发生的错误,并根据错误是如何确定它是否已经被报告来完成工作。因此,为了时间的利益,启动处理程序是允许我继续使用我的原始计划的。我会更多地更新我昨天发现的问题。 – balex

+0

如果你真的想使用启动处理程序,它不能从一个配方加载,它必须加载到'client.rb',因为它必须在运行开始之前的其他任何事情开始(包括同步食谱作为此可能需要一些时间,处理者的一部分将报告例证的进展)。 – Tensibai

+0

这就是O'reilly所说的“定制厨师”一书所说的做法,但我没有任何运气让它以这种方式工作。在我的问题中,前两个代码段是本书如何说明的,最后一段代码段就是我目前使用的代码段,因为我摆脱了错误,并看到了一些结果。出于某种原因,对其中包含处理程序的ruby文件的要求不起作用,所以我开始试图使其工作。 – balex

相关问题