自定义函数中的 Puppet 异常处理 (Puppet+Ruby)

Puppet exceptions handling in custom functions (Puppet+Ruby)

我创建了一个木偶函数(模块 Puppet::Parser::Functions newfunction() ) getfromdb 它尝试从 db.net 主机获取 url 数据,更新本地缓存文件和 url.body 的 return 内容。如果对服务器的 http 请求失败,它会使用本地缓存数据文件。

为了实现这个我想在函数中捕获异常:

require "net/http"
require "uri"
    
uri = URI("http://db.net:3013/api/nagios/sets.cfg")
    begin
      puts "here"
      res = Net::HTTP.get_response(uri)
      puts "No here"
    rescue Errno::ECONNREFUSED => e
      puts "http://db.net:3013/api/nagios/sets.cfg " + e
    else
      puts "Fetching: http://db.net:3013/api/nagios/sets.cfg"
    end

3013 端口上的服务器不是运行。 这是我在人偶输出中得到的:

Info: Scope(Class[ZSX::Service::Monitor]): ------------------ Applying service class z::service::monitor
Info: Scope(Class[Nagios::Server2]): Applying class nagios::server2
here
Error: Evaluation Error: Error while evaluating a Function Call, no implicit conversion of Errno::ECONNREFUSED into String (file: /modules/nagios/manifests/server2.pp, line: 115, column: 13) on node puppet-node.net

而在 irb 控制台中它的行为不同:

irb(main):018:0>     begin
irb(main):019:1*       puts "here"
irb(main):020:1>       res = Net::HTTP.get_response(uri)
irb(main):021:1>       puts "No here"
irb(main):022:1>     rescue Errno::ECONNREFUSED => e
irb(main):023:1>       puts "Could not fetch: http://db.net:3013/api/nagios/sets.cfg " + e
irb(main):024:1>     else
irb(main):025:1*       puts "Fetching: http://db.net:3013/api/nagios/sets.cfg"
irb(main):026:1>     end
here
Could not fetch: http://db.net:3013/api/nagios/sets.cfg Connection refused - connect(2)
=> nil

为什么我无法挽救 puppet Ruby 函数中的 HTTP 异常?

我假设当您在 IRB 中测试此功能时,您使用的是 Ruby 的 MRI(Matz 的 Ruby 解释器又名 CRuby)。当您执行非延迟自定义 Puppet 函数时,它将在不同解释器中的 Puppet master 上执行:JRuby。在 JRuby 中,异常是一个对象,它没有像 MRI 中那样用于转换为字符串的重载成员方法。因此,在将代码作为自定义 Puppet 函数执行时,您会看到无法将对象隐式转换为字符串的错误消息。

但是,异常 class 对象确实有一个允许访问错误消息的成员。该成员是 message 成员。因此,您可以快速更新自定义 Puppet 函数中的代码:

puts "http://db.net:3013/api/nagios/sets.cfg " + e.message

它应该按照您的初衷工作。另请注意,如果您在 Puppet 目录编译期间延迟该函数,它将在所有客户端上与 MRI 一起执行。这是一个替代修复,但显然 cost/benefit.