在模板中遍历数组
在前面的例子中,我们已经看到使用 Ruby 可以根据表达式的结果插入不同的值。 你也可以使用循环对数组中的每个元素生成内容。
操作步骤
添加如下代码到你的配置清单:
$ipaddresses = [ '192.168.0.1', '158.43.128.1', '10.0.75.207' ] file { "/tmp/addresslist.txt": content => template("admin/addresslist.erb") }
使用如下内容创建 /etc/puppet/modules/admin/templates/addresslist.erb 文件:
<% ipaddresses.each do |ip| -%> IP address <%= ip %> is present. <% end -%>
运行 Puppet:
# puppet agent --test info: Retrieving plugin info: Caching catalog for cookbook.bitfieldconsulting.com info: Applying configuration version '1304766335' notice: /Stage[main]//Node[cookbook]/File[/tmp/addresslist.txt]/ ensure: defined content as '{md5}7ad1264ebdae101bb5ea0afef474b3ed' notice: Finished catalog run in 0.64 seconds
检查生成文件的内容:
# cat /tmp/addresslist.txt IP address 192.168.0.1 is present. IP address 158.43.128.1 is present. IP address 10.0.75.207 is present.
工作原理
在模板的第一行,我们引用了一个数组 ipaddresses,并调用了相应的 each 方法:
<% ipaddresses.each do |ip| -%>
使用 Ruby 创建的这个循环将对数组中的每个元素执行一次。 每循环一次,变量 ip 将会设置成数组当前元素的值。
在我们的例子中,ipaddresses 数组包含三个元素,所以下面的行将执行三次, 对每个数组元素执行一次:
IP address <%= ip %> is present.
结果将产生如下三行内容:
IP address 192.168.0.1 is present. IP address 158.43.128.1 is present. IP address 10.0.75.207 is present.
最后一行是循环的结束:
<% end -%>
注意循环的第一行和最后一行都以 -%> 结束,而不是我们以前所看到的以 %> 结束。 使用 - 的作用是要抑制换行,否则会产生换行符,即在文件中产生无用的空白行。
更多用法
模板也可以遍历哈希,或哈希数组,例如:
$interfaces = [ { name => 'eth0',
ip => '192.168.0.1' },
{ name => 'eth1',
ip => '158.43.128.1' },
{ name => 'eth2',
ip => '10.0.75.207' } ]
<% interfaces.each do |interface| -%>
Interface <%= interface['name'] %> has the address <%= interface['ip']%>.
<% end -%>
结果为:
Interface eth0 has the address 192.168.0.1.
Interface eth1 has the address 158.43.128.1.
Interface eth2 has the address 10.0.75.207.
参见本书
- 第 5 章的 使用 ERB 模板 一节