Answers:
参数化类是一种语言构造,可帮助您更好地构造代码。它可以防止您过度使用全局变量(例如您的示例)。
假设您在节点描述中增加了20个类,并且所有这些都需要在清单的全局或节点范围内设置一些变量。另外,通过参数化的类,您可以轻松拥有默认参数,因此您可以使用的默认值,$file_owner
而不必larry
在几个不同的位置提供相同的值(例如)。
您的示例代码段(具有两个其他节点)可以编写如下:
node 'example.com' {
class { bar: }
}
node 'example.net' {
class { bar: owner = "harry" }
}
node 'example.net' {
class { bar: file_name = "barry.txt" }
}
class bar($owner = "larry", $file_name = "larry.txt") {
class { do_stuff: owner => $owner, file_name => $file_name }
}
class do_stuff($owner, $file_name) {
file { $file_name:
ensure => file,
owner => $owner,
}
}
使用全局变量时,您需要$owner
在每个节点中声明一个命名的变量,并且您将无法覆盖$file_name
每个节点的变量/参数。相反,您需要bar
为每个节点声明另一个类。
有关Puppet语言发展的文档以及语言指南当然提供了一些有关如何使用参数化类以及该语言构造背后的原理的良好示例:
考虑这一点的最佳方法是从头开始,而不是从已经了解木偶成语开始。
首先,您想要做的是将参数传递给类-您正在向其提供信息以决定如何执行行为,就像将参数传递给函数一样。假设这是perl,并且您有一个名为multiple_squares的函数。您会像这样调用它multiply_squares(3, 4)
,而不是将一些全局变量设置为3和4,然后从函数内部读取它们!
但是从历史上看,Puppet代码必须使用全局变量或动态范围来做到这一点,因为在设计该语言之前就已经需要这样做。就个人而言,我认为一旦参数化类得到了进一步发展和广泛部署,它们基本上将使可变范围问题成为过去,因为拥有适用于这项工作的正确工具将消除整个令人恐惧的黑手党。
$bar::file_name
和$::file_owner
访问这些相应的变量。但是,当使用参数化的类时,通过参数传递到类中的变量将成为局部范围的变量。