Puppet迭代字符串/数组

Ala*_*ery 1 puppet

你能想到在Puppet中解决这个问题的方法吗?

我有一个自定义事实,根据运行的域生成一串IP地址,它可以解析为有1到n个地址.

"10.1.29.1"
"10.1.29.1,10.1.29.5"
"10.1.29.1,10.1.29.5,10.1.29.7"
etc
Run Code Online (Sandbox Code Playgroud)

我想将这些添加到主机文件中,例如生成的服务器名称为servernameX;

10.1.29.1 myservername1
10.1.29.5 myservername2
10.1.29.7 myservername3
Run Code Online (Sandbox Code Playgroud)

所以你怎么能这样做,因为puppet没有像"for each"这样的数组迭代器?

Krz*_*ski 6

遗憾的是,即使您在使用逗号分割自定义事实时使用自定义"定义"迭代数组,结果也不是您所期望的,甚至不接近"for each"循环 - 可能,除了让你头疼.

说,我不确定这是否是你想要实现的,但看看这种方法:

$fact = '1.1.1.1,2.2.2.2,3.3.3.3'

$servers = split($::fact, ',')
$count   = size($servers)

$names = bracket_expansion("host[01-${count}].address")

file { '/tmp/test.txt':
  content => inline_template('<%= @servers.each_with_index.map {|v,i| "#{v}\t\t#{@names[i]}\n" } %>'),
  ensure  => present
}
Run Code Online (Sandbox Code Playgroud)

我们有两个自定义函数:size()和bracket_expansion(); 然后,我们使用它们在hack中提供的值,利用inline_template()函数来利用对两个数组的并行访问来呈现文件的内容 - 一个具有来自您的事实的IP地址,另一个具有应该遵循的主机名.

结果如下:

matti@acrux ~ $ cat | puppet apply
$fact = '1.1.1.1,2.2.2.2,3.3.3.3'

$servers = split($::fact, ',')
$count   = size($servers)

$names = bracket_expansion("host[01-${count}].address")

file { '/tmp/test.txt':
  content => inline_template('<%= @servers.each_with_index.map {|v,i| "#{v}\t\t#{@names[i]}\n" } %>'),
  ensure  => present
}
notice: /Stage[main]//File[/tmp/test.txt]/ensure: created
notice: Finished catalog run in 0.07 seconds
matti@acrux ~ $ cat /tmp/test.txt 
1.1.1.1         host01.address
2.2.2.2         host02.address
3.3.3.3         host03.address
matti@acrux ~ $
Run Code Online (Sandbox Code Playgroud)

size()和bracket_expansion()函数都可以在这里找到:

https://github.com/kwilczynski/puppet-functions/tree/master/lib/puppet/parser/functions/

希望这会有帮助 :-)