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

时间:2018-12-05 23:11:35

标签: 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开始。

我需要创建一个字符串,其中包含用逗号分隔的字符串列表,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。

1 个答案:

答案 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)连接字符串数组。