0

我有一对 Puppet 自定义函数,其中一个,即 am_func_cluster,返回当前运行实例的数组哈希(读取文件作为输入),第二个调用该函数,遍历数组并返回第一个成功的监听端口 22。这是第二个功能:

module Puppet::Parser::Functions
    newfunction(:am_func_head, :type => :rvalue ) do |args|

        Puppet::Parser::Functions.function('am_func_cluster')
        mCls = function_am_func_cluster(['/opt/running-inst.txt'])
        cls = args[0].to_sym if args[0].is_a? String

        require 'socket'
        require 'timeout'

        mCls[cls].each do |dns|

           begin
               Timeout::timeout(1) { TCPSocket.new(dns, 22)
                    return (dns if mCls.key?(cls)) || 'undefined'
               }
               break
               rescue SocketError
               rescue Timeout::Error
           end
        end
    end
end

运行时,它返回此错误:

错误:无法从远程服务器检索目录:服务器上的错误 400:返回无法跨节点 ip-10-0-9-130.xxx 上 /etc/puppet/manifests/nodes.pp:19 的线程跳转

如果我在脚本中注释掉该begin ... end位,它就可以正常工作。到目前为止,谷歌在这种情况下并没有给予太多帮助。有谁知道这个错误是什么意思或者我做错了什么。仍然没有发现自己非常有效地理解 Ruby 返回的错误。任何指针都非常感谢。干杯!!

4

1 回答 1

0

正如它所说,你不能return在那里使用。用于break逃离超时块:

require "timeout"
Timeout.timeout(3){break "foo"}
# => "foo"

你不应该break在它之外使用。

作为一般提示,很容易混淆returnbreaknext。如果其中一个不起作用,请尝试另一个。

于 2013-11-11T13:58:13.727 回答