遍历多个项目

该死的东西一个接一个! 数组Arrays)是 Puppet 的一个强大特性; 不论何时,你要对列表中的元素执行相同的操作,数组就会帮你的忙。 你可以创建一个数组,将所有的数组元素放在一对方括号中并以逗号间隔,例如:

$lunch = [ "franks", "beans", "mustard" ]

操作步骤

在你的配置清单中添加如下代码:

$packages = [ "ruby1.8-dev",
              "ruby1.8",
              "ri1.8",
              "rdoc1.8",
              "irb1.8",
              "libreadline-ruby1.8",
              "libruby1.8",
              "libopenssl-ruby" ]

package { $packages: ensure => installed }

运行 Puppet,值得注意的是现在每个软件包都应该被安装。

工作原理

当 Puppet 遇到数组作为资源名的情况时,它会对数组中的每个元素创建一个资源。 在前面的例子中,对 $packages 数组中的每一个包, 使用相同的参数(ensure => installed)创建了一个新的 package 资源。 这是对很多类似的资源进行实例化的一个非常紧凑的方式。

更多用法

如果你听到哈希(hash),会比数组更兴奋。

哈希

哈希hash)与数组类似,但它的每个元素都可以通过名字存储和查找。例如:

$interface = { name    => 'eth0',
               address => '192.168.0.1' }

notice("Interface ${interface[name]} has address ${interface[address]}")

的执行结果为:

Interface eth0 has address 192.168.0.1

你可以给哈希赋任意的值:字符串、函数调用、表达式、甚至其它哈希或数组。

使用 split 函数创建数组

你可以使用方括号来声明文字数组,例如:

define lunchprint() {
    notify { "Lunch included $name": }
}

$lunch = [ "egg", "beans", "chips" ]
lunchprint { $lunch: }

执行结果为:

Lunch included egg
Lunch included beans
Lunch included chips

但是 Puppet 还可以使用 split 函数从一个字符串创建数组,例如:

$menu = "egg beans chips"
$items = split($menu, ' ')
lunchprint { $items: }

执行结果为:

Lunch included egg
Lunch included beans
Lunch included chips

注意 split 函数携带两个参数:第一个参数是要被拆分的字符串;第二个参数是拆分间隔符, 在本例中是一个空格。当 Puppet 遍历字符串时,一遇到空格就将其视为一个元素的结束和下一个元素的开始。 所以,给定的字符串 "egg beans chips" 将被拆分为三个元素。

拆分间隔符可以是任意字符或字符串:

$menu = "egg and beans and chips"
$items = split($menu, ' and ')

拆分间隔符也可以是正则表达式(regular expression),例如:一个多选一集合可以使用 | (pipe) 符号来做间隔:

$lunch = "egg:beans,chips"
$items = split($lunch, ':|,')