在模板中遍历数组

在前面的例子中,我们已经看到使用 Ruby 可以根据表达式的结果插入不同的值。 你也可以使用循环对数组中的每个元素生成内容。

操作步骤

  1. 添加如下代码到你的配置清单:

    $ipaddresses = [ '192.168.0.1',
                     '158.43.128.1',
                     '10.0.75.207' ]
    
    file { "/tmp/addresslist.txt":
        content => template("admin/addresslist.erb")
    }
    
  2. 使用如下内容创建 /etc/puppet/modules/admin/templates/addresslist.erb 文件:

    <% ipaddresses.each do |ip| -%>
    IP address <%= ip %> is present.
    <% end -%>
    
  3. 运行 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
    
  4. 检查生成文件的内容:

    # 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.
    

工作原理

  1. 在模板的第一行,我们引用了一个数组 ipaddresses,并调用了相应的 each 方法:

    <% ipaddresses.each do |ip| -%>
    
  2. 使用 Ruby 创建的这个循环将对数组中的每个元素执行一次。 每循环一次,变量 ip 将会设置成数组当前元素的值。

  3. 在我们的例子中,ipaddresses 数组包含三个元素,所以下面的行将执行三次, 对每个数组元素执行一次:

    IP address <%= ip %> is present.
    
  4. 结果将产生如下三行内容:

    IP address 192.168.0.1 is present.
    IP address 158.43.128.1 is present.
    IP address 10.0.75.207 is present.
    
  5. 最后一行是循环的结束:

    <% end -%>
    
  6. 注意循环的第一行和最后一行都以 -%> 结束,而不是我们以前所看到的以 %> 结束。 使用 - 的作用是要抑制换行,否则会产生换行符,即在文件中产生无用的空白行。

更多用法

模板也可以遍历哈希,或哈希数组,例如:

$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.

参见本书