如何在 Puppet 中使用数组配置参数化类?

如何在 Puppet 中使用数组配置参数化类?

我的目标是定义一个以成对数组作为输入的类。由于我不确定如何定义成对数组,所以我将使用成对数组。

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. 有没有办法定义一个类来处理一组数据,就像我在这里尝试做的那样?
  2. 我怀疑我没有使用正确的构造来实现我的目标。我应该怎么做?

答案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.ppPuppet 的 中$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,则需要它。

相关内容