💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
### 遍历多个项目 该死的东西一个接一个! **数组**(**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, ':|,') ```