0

Puppet カスタム関数のペアがあります。そのうちの 1 つである am_func_cluster は、現在実行中のインスタンスの配列のハッシュを返し (ファイルを入力として読み取ります)、2 番目の関数はその関数を呼び出し、配列を反復処理して、最初に成功した関数を返します。これはポート 22 をリッスンします。2 番目の関数は次のとおりです。

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スクリプト内のビットをコメントアウトすると、問題なく動作します。これまでのところ、Google はこの件についてあまり好意的ではありませんでした。そのエラーが何を意味するのか、または何が間違っているのかを知っている人はいますか。Ruby から返されるエラーを十分に理解できていません。どんなポインタでも大歓迎です。乾杯!!

4

1 に答える 1