通常在处理复杂的木偶模块时,我会在节点级别或类内部设置变量.例如.,
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,} }
参数化类如何/何时/为何在这种情况下有所帮助?你是如何使用参数化类来构建你的木偶模块的?
解决方法
参数化类是一种语言结构,可以帮助您更好地构建代码.它可以防止您过度使用全局变量(如示例中所示).
想象一下,您在节点描述中包含了20多个类,并且所有类都需要在清单的全局或节点范围中设置一些变量.参数化类也允许您轻松拥有默认参数,因此您可以使用$file_owner的默认值,而不必在几个不同的位置提供相同的值(例如拉里).
您的示例代码段(带有两个额外的节点)可以编写如下:
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语言演变的文档,当然还有语言指南,提供了一些关于如何使用参数化类的好例子以及这种语言结构背后的基本原理:
> http://projects.puppetlabs.com/projects/1/wiki/Development_Language_Evolution#Parameterized+classes
> http://docs.puppetlabs.com/guides/language_guide.html#parameterised-classes