为什么要使用 puppet 参数化类?

rob*_*byt 12 linux puppet

通常在处理复杂的 puppet 模块时,我会在节点级别或类内部设置变量。例如,

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,
  }
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,参数化类如何/何时/为什么会有所帮助?您如何使用参数化类来构建您的 puppet 模块?

jos*_*chi 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,
  }
}
Run Code Online (Sandbox Code Playgroud)

使用全局变量时,您需要声明一个$owner在每个节点中命名的变量,并且无法覆盖$file_name每个节点的变量/参数。相反,您需要bar为每个节点声明另一个类。

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


小智 8

考虑这个问题的最好方法是从头开始,而不是从已经知道 Puppet 习语开始。

您首先要做的是将参数传递给类——您为其提供所需的信息以决定其行为方式,就像将参数传递给函数一样。假设这是 perl 并且您有一个名为 multiply_squares 的函数。你可以这样称呼它multiply_squares(3, 4),而不是将一些全局变量设置为 3 和 4,然后从函数内部读取它们!

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