为什么我应该使用木偶参数化类?

通常在处理复杂的傀儡模块时,我会在节点级别或类内设置variables。 例如,

node 'foo.com' { $file_owner = "larry" include bar } class bar { $file_name = "larry.txt" include do_stuff } class do_stuff { file { $file_name: ensure => file, owner => $file_owner, } } 

在这种情况下,参数化类如何/何时/为什么会起作用? 你如何使用参数化类来构build你的木偶模块?

参数化类是一种语言结构,可以帮助您更好地构build代码。 它可以防止你过度使用全局variables(如你的例子)。

假设您在节点描述中包含了20多个类,并且所有将需要在清单的全局或节点范围中设置一些variables。 另外参数化的类允许你轻松地使用默认参数,所以你可以使用$file_owner的默认值,而不必在几个不同的地方提供相同的值(例如larry )。

你的例子片断(有两个额外的节点)可以写成如下forms:

 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, } } 

在使用全局variables的情况下,您需要在每个节点中声明一个名为$owner的variables,并且不能覆盖每个节点的$file_namevariables/参数。 相反,你需要为每个节点声明另一个bar类。

关于Puppet语言进化的文档,当然还有语言指南,提供了一些关于如何使用参数化类以及这个语言结构背后的基本原理的很好的例子:

最好的办法是从头开始,而不是从已经知道木偶习语开始。

你想要做的首先是将parameter passing给一个类 – 你给它的信息,以决定如何行为,就像传递函数的参数。 说这是Perl,你有一个函数multiply_squares。 你会把它称为multiply_squares(3, 4) ,而不是将一些全局variables设置为3和4,然后从函数内部读取它们!

但从历史上看,Puppet代码必须用全局variables或dynamic范围来做,因为在语言devise之前就需要这样做。 就个人而言,我认为一旦参数化类得到了更多的发展和更广泛的部署,他们基本上将variables范围问题变成了过去的事情,因为拥有正确的工具可以消除整个层次的可怕黑客。