Puppet中数组转换为指定格式拼接字符串的实现问题
解决数组转节点配置字符串的问题
我来帮你搞定这个字符串生成的问题!你之前的代码主要有两个小问题:一是没必要把数组自己合并一遍(导致每个节点出现两次),二是reduce的逻辑没处理好初始值和拼接格式,才会出现多余的=和重复内容。
正确的实现思路
其实不需要复杂的reduce,用map先把每个节点转换成你想要的键值对格式,再用join把它们用逗号连起来就行,这样既简洁又能满足你“加节点只需改数组”的需求。
完整代码示例
$nodes = ['node1','node2','node3'] # 先把每个节点转换成 "node=http://node:2380" 的格式 $node_entries = $nodes.map |$node| { "${node}=http://${node}:2380" } # 用逗号把所有条目连接成最终字符串 $somestring = $node_entries.join(',') notify {"nodelist is ${somestring}":}
代码解释
map遍历数组里的每个节点,把每个节点替换成指定格式的字符串,得到新数组["node1=http://node1:2380", "node2=http://node2:2380", "node3=http://node3:2380"]join(',')会把数组元素用逗号连接,自动处理分隔符,不会出现结尾多余的逗号- 后续要加节点的话,直接在
$nodes数组里新增元素就行,比如加'node4',代码会自动生成对应的条目
你原来代码的问题分析
$merged = concat($nodes, $nodes2):把同一个数组拼接了一遍,导致每个节点出现两次,所以最终结果里有重复的node2和node3reduce没有设置初始值,第一次迭代时$memo是数组的第一个元素node1,然后拼接时写成"${memo} = http://$value:2380,",就变成了node1 = http://node2:2380,(还多了空格),后面的迭代继续错误拼接,才出现了那些多余的=和重复内容
内容的提问来源于stack exchange,提问作者GeoSword
相关产品推荐
相关产品推荐

