Ruby 如何迭代字符串以将nagios_服务检查构造为导出资源?

Ruby 如何迭代字符串以将nagios_服务检查构造为导出资源?,ruby,erb,puppet,nagios,Ruby,Erb,Puppet,Nagios,我编写了一个自定义事实,它返回一个逗号分隔的addr:port列表,如下所示: sb_intl_conn => sbcms-t:22,sbsql05-wvuk-inst5:1434,sborc07-uk-t:1533,..,..,.. 字符串中的元素数量因节点而异。我需要对每一个进行Nagios tcp端口检查。我想,sb_intl_conn.split(“,”)会把这个字符串变成一个数组,然后我如何迭代它来做类似的事情 @@nagios_service { "check_stat_${

我编写了一个自定义事实,它返回一个逗号分隔的
addr:port
列表,如下所示:

sb_intl_conn => sbcms-t:22,sbsql05-wvuk-inst5:1434,sborc07-uk-t:1533,..,..,..
字符串中的元素数量因节点而异。我需要对每一个进行Nagios tcp端口检查。我想,
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

我本想采纳亚马瑟的建议,但还没能理解。这就是我所做的:在我的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}": }
    }
}
在节点上引发以下错误:

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
我不明白我做错了什么。为什么is
找不到'abc'的值
;不是abc.com?有什么想法吗??干杯


更新:2

我最终使用了heira,并决定尝试最初的“哈希数组”想法,但在实现时遇到了一些问题:

这就是我在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} *********": }
    }
}
和my node.pp:

$ifs = ['abc.com:80','xyz.co.uk:1512']
test::foo::bar {$ifs:}
$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:}

还有什么想法吗?干杯

此示例可能有助于解决您的特殊情况

  $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}": }
  }

谢谢你的提醒。我今晚试试,然后回来汇报。干杯只是想知道,在这种情况下,如果我使用Ruby DSL而不是Puppet DSL,会不会更容易?干杯我没有太多地使用Ruby DSL,所以不能发表太多评论。您可以使用Ruby DSL创建一个哈希,然后将其传递给Puppet define type。。。试试看:)试着按照你的建议去做,但还是出错了。详细信息请参见原始帖子中的“更新”。干杯请参阅我的答案中的更新。我仍然建议您使用散列,而不是在数组中拆分字符串。如果$foo中有两个以上的元素,则会更容易。
  $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}": }
  }
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'