自定义函数中的 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.
我创建了一个木偶函数(模块 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.