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