如何在puppet中configuration数组的参数化类?

我的目标是定义一个类,它需要input一个数组对。 由于我不知道如何定义一个数组对,我只是要使用一对数组来代替。

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'后,我希望输出遍历两个数组,打印出通知,然后按照数组给出的顺序指出学生(听起来很可怕)。 我试过这个,结果发生了什么,是傀儡将数组合并成一个string,所以$ users的值最终是: elionazeeroot和$ names的值最终成为了El Lion Avery Zee Rooty Root

两个问题:

  1. 有没有办法定义一个类来处理一组数据,就像我在这里要做的一样?
  2. 我怀疑我没有使用正确的结构来实现我的目标。 我该怎么做呢?

以编程语言来表示数据的自然方式是这样的哈希:

 $users = { elion => 'El Lion', azee => 'Avery Zee', root => 'Rooty Root, } 

虽然在Puppet中可以做到这一点,但我发现最好决定单个条目的资源定义是什么,然后将散列结构构build为可以传递给create_resources()的东西 。 在这种情况下,这意味着这样的事情:

 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可以让你将你的代码(清单定义)与你的数据分开(在这种情况下是学生的特定名字)。 完整的,这是我会为你的设置做什么:

  • 把学生数据放在一个hiera文件中。 你可以使用JSON或YAML; 我喜欢YAML。 这将是这样的:

     classroom::users: elion: full_name: El Lion azee: full_name: Avery Zee root: full_name: Rooty Root 
  • 为学生定义资源types,并将其放置在Puppet的$modulepath中的classroom/manifests/student.pp中。 它看起来像上面的student资源types,但会被命名为classroom::student

  • classroom/manifests/init.pp定义一个classroom课程,内容如下:

     class classroom ( $users = hiera('classroom::users', undef), ) { create_resources(classroom::student, $users) } 

如果您使用的是Puppet 3.x,则类参数中的hiera()调用是多余的,但是如果您仍在Puppet 2.7中,则需要它。