Puppet 从哈希迭代构造可变字符串

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

我被以下几天的木偶密码卡住了,你能帮我一下吗

在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与我运行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, ',')
说明:

  • 函数根据一些条件从数组或哈希中选择元素
  • 函数对数组或散列的所有元素执行转换,并返回转换后的数据数组
  • join
    函数(Puppet 5.5之前的函数来自stdlib)连接字符串数组

聪明的链条;好奇的是:你能不能把
.join
链接到作为内在函数的版本上?我想是的。@MattSchuchard,是的,我刚刚测试并更新了答案。很好;我只是对方法链接有一种视觉上的偏好,这让我很兴奋,因为这在现代Puppet中现在是有效的语法。