多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
### 在模板中遍历数组 在前面的例子中,我们已经看到使用 Ruby 可以根据表达式的结果插入不同的值。 你也可以使用循环对数组中的每个元素生成内容。 #### 操作步骤 1. 添加如下代码到你的配置清单: ``` $ipaddresses = [ '192.168.0.1', '158.43.128.1', '10.0.75.207' ] file { "/tmp/addresslist.txt": content =&gt; template("admin/addresslist.erb") } ``` 2. 使用如下内容创建 /etc/puppet/modules/admin/templates/addresslist.erb 文件: ``` &lt;% ipaddresses.each do |ip| -%&gt; IP address &lt;%= ip %&gt; is present. &lt;% end -%&gt; ``` 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 方法: ``` &lt;% ipaddresses.each do |ip| -%&gt; ``` 2. 使用 Ruby 创建的这个循环将对数组中的每个元素执行一次。 每循环一次,变量 ip 将会设置成数组当前元素的值。 3. 在我们的例子中,ipaddresses 数组包含三个元素,所以下面的行将执行三次, 对每个数组元素执行一次: ``` IP address &lt;%= ip %&gt; 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. 最后一行是循环的结束: ``` &lt;% end -%&gt; ``` 6. 注意循环的第一行和最后一行都以 -%&gt; 结束,而不是我们以前所看到的以 %&gt; 结束。 使用 - 的作用是要抑制换行,否则会产生换行符,即在文件中产生无用的空白行。 #### 更多用法 模板也可以遍历哈希,或哈希数组,例如: ``` $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 模板](#ch05sec04) 一节