Arrays puppet中的数组转换,用于最终加入并包含在命令中

Arrays puppet中的数组转换,用于最终加入并包含在命令中,arrays,iteration,puppet,Arrays,Iteration,Puppet,这听起来很琐碎,但我不能全神贯注于我需要做的事情!我有: $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

这听起来很琐碎,但我不能全神贯注于我需要做的事情!我有:

$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迭代器()在数组的每个元素中插入两次字符串:

此时,我们可以进行元组/数组到字符串的转换(),但这将需要分隔符表示法的复杂标志以及随后可能的正则表达式替换。使用puppetlabs stdlib中的
join
更容易,它几乎存在于每个Puppet环境中():


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

从架构的角度来看,这并不是最好的解决方法。从实现的角度来看,这里的陷阱是使用
reduce
作为lambda迭代器。如果您不太关心存储报税表,那么可以使用
每个
。如果您是,那么
map
with
结合将使您达到目标。“如果这让人困惑,我可以写一个答案。”马特舒查德。谢谢&是的,谢谢!
$somearray = $nodes.map |$node| {
  "${node}=http://${node}:2380"
}
# $somearray = ['node1=http://node1:2380', 'node2=http://node2:2380', 'node3=http://node3:2380']
$somestring = join($somearray, ',')
# $somestring = 'node1=http://node1:2380,node2=http://node2:2380,node3=http://node3:2380'