Puppet 从哈希迭代构造可变字符串
我被以下几天的木偶密码卡住了,你能帮我一下吗 在hiera,我有以下结构:Puppet 从哈希迭代构造可变字符串,puppet,Puppet,我被以下几天的木偶密码卡住了,你能帮我一下吗 在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
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与我运行puppet的服务器的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\u broker
仍然是空的,然后我必须修复前面的逗号
有更好的方法吗
我使用的是Puppet 4。问题在于,尽管Puppet具有迭代功能,但它不允许重新分配变量() 因此,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命令是内置的,那么也可以链接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, ',')
说明:
- 函数根据一些条件从数组或哈希中选择元素
- 函数对数组或散列的所有元素执行转换,并返回转换后的数据数组
函数(Puppet 5.5之前的函数来自stdlib)连接字符串数组join
.join
链接到作为内在函数的版本上?我想是的。@MattSchuchard,是的,我刚刚测试并更新了答案。很好;我只是对方法链接有一种视觉上的偏好,这让我很兴奋,因为这在现代Puppet中现在是有效的语法。