人偶中的数组转换以最终加入并包含在命令中

Array transformation in puppet for eventual joining and inclusion in a command

这听起来微不足道,但我无法全神贯注于我需要做的事情!我有:

$nodes = ["node1", "node2", "node3"]

我想这样结束:

$somestring = "node1=http://node1:2380,node2=http://node2:2380,node3=http://node3:2380"

我试过这个:

 $nodes = ['node1','node2','node3']
 $nodes2 = $nodes
 $merged = concat($nodes, $nodes2)
 $sorted = sort($merged)
 $test = $sorted.reduce |$memo, $value | {
   "${memo} = http://$value:2380,"
 }
 notify {"nodelist is $test":}

但给我:

node1=http://node1:2380,=http://node2:2380,=http://node2:2380,=http://node3:2380,=http://node3:2380,

我的想法是,在可能需要向该集群添加节点的情况下,一旦我准备好节点,我就可以向数组添加一个条目。

使用您的命名约定,我们从数组开始:

$nodes = ['node1', 'node2', 'node3']

然后我们需要使用 map lambda 迭代器 (https://puppet.com/docs/puppet/5.5/function.html#map) 在数组的每个元素中插入字符串两次:

$somearray = $nodes.map |$node| {
  "${node}=http://${node}:2380"
}
# $somearray = ['node1=http://node1:2380', 'node2=http://node2:2380', 'node3=http://node3:2380']

此时,我们可以进行 Tuple/Array 到字符串的转换 (https://puppet.com/docs/puppet/5.5/function.html#array--tuple-to-string), but this would require complicated flags for delimiter notation and a possible regular expression substitution afterward. Much easier would be to use join from puppetlabs-stdlib, which is present in almost every Puppet environment (https://forge.puppet.com/puppetlabs/stdlib#join):

$somestring = join($somearray, ',')
# $somestring = 'node1=http://node1:2380,node2=http://node2:2380,node3=http://node3:2380'

有趣的事实:split 是一个 Puppet 内部函数,但 join 需要 stdlib。不确定那是怎么发生的。