为什么要使用人偶参数化类?


12

通常,当使用复杂的人偶模块时,我将在节点级别或类内部设置变量。例如,

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

在这种情况下,参数化类如何/何时/为什么提供帮助?您如何使用参数化的类来构造人偶模块?


2
请注意所有发现此示例的人,此代码显示了Puppet版本<3.0中允许的全局变量查找。在Puppet> 3.0中,您不能访问超出范围的变量,而必须使用名称空间访问变量。在此示例中,您将必须使用$bar::file_name$::file_owner访问这些相应的变量。但是,当使用参数化的类时,通过参数传递到类中的变量将成为局部范围的变量。
罗比

Answers:


12

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

假设您在节点描述中增加了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语言发展的文档以及语言指南当然提供了一些有关如何使用参数化类以及该语言构造背后的原理的良好示例:


8

考虑这一点的最佳方法是从头开始,而不是从已经了解木偶成语开始。

首先,您想要做的是将参数传递给类-您正在向其提供信息以决定如何执行行为,就像将参数传递给函数一样。假设这是perl,并且您有一个名为multiple_squares的函数。您会像这样调用它multiply_squares(3, 4),而不是将一些全局变量设置为3和4,然后从函数内部读取它们!

但是从历史上看,Puppet代码必须使用全局变量或动态范围来做到这一点,因为在设计该语言之前就已经需要这样做。就个人而言,我认为一旦参数化类得到了进一步发展和广泛部署,它们基本上将使可变范围问题成为过去,因为拥有适用于这项工作的正确工具将消除整个令人恐惧的黑手党。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.