遍历多个项目
该死的东西一个接一个! 数组(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, ':|,')