我的目标是定义一个类,该类将一对数组作为输入。由于我不确定如何定义成对的数组,因此我将改为使用一对数组。
class student($username, $full_name){
notify {"user": message => "username: ${username}\n"}
notify {"fullname": message => "fullname: ${full_name}\n"}
exec {'finger': command => "/usr/bin/finger ${username}", logoutput => true }
}
$users = ['elion', 'azee', 'root']
$names = ['El Lion', 'Avery Zee', "Rooty Root"]
class { 'student':
username => $users,
full_name => $names
}
在执行“puppet apply file.pp”后,我希望输出遍历两个数组,打印出通知并按照数组给定的顺序指法学生(这听起来很糟糕)。我尝试了这个,结果发生了什么,木偶将数组合并为一个字符串,所以 $users 值最终为:elionazeeroot
并且 $names 值最终为El Lion Avery Zee Rooty Root
.
两个问题:
- 有没有办法定义一个类来处理一组数据,就像我在这里尝试做的那样?
- 我怀疑我没有使用正确的结构来实现我的目标。我应该怎么做呢?
用编程语言表示数据的自然方式是像这样的哈希:
虽然在 Puppet 中这样做是可能的,但我发现最好决定单个条目的资源定义是什么,然后将散列结构化为可以传递给create_resources()的内容。在这种情况下,这意味着这样的事情:
然而,正如 Ger 指出的那样,如果您使用Hiera,您会过得最好。Hiera 允许您将代码(清单定义)与数据(在本例中为学生的特定姓名)分开。完整地说,这是我将为您的设置做的事情:
将学生数据放入 hiera 文件中。您可以使用 JSON 或 YAML;我喜欢 YAML。它会是这样的:
为学生定义一个资源类型并将其放入
classroom/manifests/student.pp
Puppet 的$modulepath
. 它看起来像student
上面的资源类型,但将被命名为classroom::student
.使用以下内容定义一个
classroom
类:classroom/manifests/init.pp
如果您使用的是 Puppet 3.x,
hiera()
类参数中的调用是多余的,但如果您仍在使用 Puppet 2.7,则需要它。