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 から返されるエラーを十分に理解できていません。どんなポインタでも大歓迎です。乾杯!!