几天来,我一直被困在以下木偶代码中,您能帮我吗?
在hiera中,我具有以下结构:
my_list::servers:
server1.subnet.env.com:
id: 0
server2.subnet.env.com:
id: 1
server3.subnet.env.com:
id: 2
server4.subnet.env.com:
id: 3
其中各种server1..n
(n => 2)是特定环境中服务器的FQDN。 ID始终是按顺序排列的,但是从0开始。
我需要创建一个字符串,其中包含用逗号分隔的字符串列表,broker-${id}-check
,其中id与我运行木偶的服务器的FQDN不同,例如,如果我正在运行server2.subnet.env.com
上的脚本,字符串应为broker-0-check,broker-2-check,broker-3-check
。如果我在server1.subnet.env.com
上运行,它将是broker-1-check,broker-2-check,broker-3-check
,依此类推。
我最后的想法是:
$servers_list = hiera('my_list::servers', {"${::fqdn}" => {'id' => 0 } })
$list_broker=''
$servers_list.each |$key, $value| {
if $key != $::fqdn {
$list_broker="${list_broker},broker-${value['id']}-check"
}
}
notify {"******* ${list_broker}": }
但是list_broker
仍然为空,然后我必须修复前导逗号。
有更好的方法吗?
我正在使用Puppet 4。
答案 0 :(得分:3)
问题在于,尽管Puppet具有迭代功能,但它不允许重新分配变量(ref)。
因此,Puppet具有许多功能性的编程功能,可让您无需重新分配变量即可解决此类问题。
这有效(Puppet <5.5),其中join()
来自stdlib:
$list_broker = join(
$servers_list
.filter |$key, $value| { $key != $::fqdn }
.map |$key, $value| { "broker-${value['id']}-check" },
','
)
或者在Puppet> = 5.5(如注释中建议的那样)中,内置了join命令,该联接也可以被链接:
$list_broker = $servers_list
.filter |$key, $value| { $key != $::fqdn }
.map |$key, $value| { "broker-${value['id']}-check" }
.join(',')
如果您希望在更多步骤中使用它,
$filtered = $servers_list.filter |$key, $value| { $key != $::fqdn }
$mapped = $filtered.map |$key, $value| { "broker-${value['id']}-check" }
$list_broker = join($mapped, ',')
说明:
filter
函数根据某些条件从数组或哈希中选择元素。map
函数对Array或Hash的所有元素执行转换,并返回转换后的数据数组。join
函数(Puppet 5.5之前的版本来自stdlib)连接字符串数组。