0

次のように、のコンマ区切りのリストを返すカスタム ファクトを作成しaddr:portました。

sb_intl_conn => sbcms-t:22,sbsql05-wvuk-inst5:1434,sborc07-uk-t:1533,..,..,..

文字列内の要素の数は、ノードごとに異なります。それぞれで Nagios tcp-port-check を実行する必要があります。この文字列を配列に変換すると思いますsb_intl_conn.split(",")が、それを反復処理してこのようなことを行うにはどうすればよいですか?

@@nagios_service { "check_stat_${::fqdn}_${addr}_${port}":
    use                 => 'generic-service',
    check_command       => "remote-nrpe-tcp-check!${addr}!${port}",
    service_description => "V2::CON: ${addr} [Palms]",
    display_name        => "Connection check: ${addr}:${port}",
    servicegroups       => 'batch-worker',
    hostgroup_name      => 'batch-job',
}

どんな助けでも大歓迎です。乾杯!!


更新: 1

私はシミュレータiamauserの提案に結びついていましたが、まだ頭を悩ませることができませんでした。これは私がやったことです:私のfoo.ppで:

class test::foo {

    define bar {
        $var1 = inline_template("<%= scope.lookupvar($name).split(':').first.to_s.chomp %>")
        $var2 = inline_template("<%= scope.lookupvar($name).split(':').last.to_s.chomp %>")
        notify {"${var1}_${var2}": }
    }
}

そして、私のnode.ppで:

$ifs = ['abc.com:80','xyz.co.uk:1512']
test::foo::bar {$ifs:}

ノードで次のエラーがスローされます。

err: Could not retrieve catalog from remote server: Error 400 on SERVER: Failed to parse inline template: Could not find value for 'abc' in 65 at /etc/puppet/services/test/manifests/foo.pp:4 on node jobserver-01.local.cloud.uk
warning: Not using cache on failed catalog
err: Could not retrieve catalog; skipping run

私が間違っていることを理解していません。そして、なぜですかCould not find value for 'abc'。そうじゃないabc.com?何か案が??乾杯!!


更新: 2

私は heira を使用することになり、元の「ハッシュの配列」のアイデアを試してみることにしましたが、実装に問題がありました。

これは私がヘイラに持っているものです:

hiera -d -c /etc/puppet/hiera.yaml nag_chk m_env=talend s_env=local
[ ... ]
DEBUG: Thu Mar 21 12:28:02 +0000 2013: Got answer for key nagi_chk, final answer
DEBUG: Thu Mar 21 12:28:02 +0000 2013: Answer after outer loop = archimedes-db-02.svc.ft.com:1521 ftftp01-uvln-uk-p:22 www.google.com:80 ftaps01-lvpr-uk-local:8080
archimedes-db-02:1521 ftftp01-uvln-uk-p:22 google.com:80

次に、私の foo.pp

class test::foo {

    define bar2 () {
        $var1 = $name['addr']
        $var2 = $name['port']
        notify {"*** ${var1}_${var2} *********": }
    }
}

そして私のnode.pp:

$array_chk = hiera('nag_chk')
$urls = inline_template("<%= '$array_chk'.split(' ').map{|kv| v1,v2 = kv.split(':'); {'addr' => v1, 'port' => v2}} -%>")
test::foo::bar2 {$urls:}

いつものように、エラーが発生します。

エラー: リモート サーバーからカタログを取得できませんでした: サーバーでエラー 400: ノード talend の /etc/puppet/services/talend/talend/manifests/foo.pp:10 で 0 でアクセスすると、名前はハッシュまたは配列ではありません- jobserver-01.local.cloud.ft.com 警告: 失敗したカタログ エラーでキャッシュを使用していません: カタログを取得できませんでした。スキップラン

私は何が間違っているのですか?私が見る限り、irbコンソールの正しい形式の「ハッシュの配列」:

irb(main):001:0> STRING = "archimedes-db-02:1521 ftftp01-uvln-uk-p:22 google.com:80"
=> "archimedes-db-02:1521 ftftp01-uvln-uk-p:22 google.com:80"
irb(main):003:0>
irb(main):002:0> STRING.split(' ').map{|kv| v1,v2 = kv.split(':'); {'addr' => v1, 'port' => v2}}
=> [{"addr"=>"archimedes-db-02", "port"=>"1521"}, {"addr"=>"ftftp01-uvln-uk-p", "port"=>"22"}, {"addr"=>"google.com", "port"=>"80"}]

さらに考えはありますか?乾杯!!

4

1 に答える 1

2

この例は、特定のケースの解決に役立つ場合があります。

  $foo = [{"addr" => "bar", "port" => "1"},                                     
          {"addr" => "bat", "port" => "2"}]                                     
  testmod::bar {$foo:}                                                          
  define testmod::bar () {                                                      
    $var1 = $name["addr"]                                                       
    $var2 = $name["port"]                                                       
    notify {"${var1}_${var2}": }                                                
  }      

nagios 型を define 型の中に入れます。csv をハッシュに変更する必要がある場合があります。

更新: @MacUsers の更新後に追加されました。以下は私にとってはうまくいきます:

  $foo = ["abc.com:80","xyz.co.uk:1512"]
  testmod::bar {$foo:}
  define testmod::bar () {
    $var1 = inline_template("<%= '$name'.split(':').first.to_s.chomp %>")
    $var2 = inline_template("<%= '$name'.split(':').last.to_s.chomp %>")
    notify {"${var1}_${var2}": }
  }

puppet エージェントを実行すると、次のようになります。

Notice:     /Stage[main]/Testmodule/Testmodule::Testmod::Bar[abc.com:80]/Notify[abc.com_80]/message: defined 'message' as 'abc.com_80'
Notice: xyz.co.uk_1512
Notice:    /Stage[main]/Testmodule/Testmodule::Testmod::Bar[xyz.co.uk:1512]/Notify[xyz.co.uk_1512]/message: defined 'message' as 'xyz.co.uk_1512'
于 2013-03-15T01:46:43.863 に答える