从不同的puppet模块扩展类

从不同的puppet模块扩展类,puppet,Puppet,我需要从不同的Puppet模块扩展一个类。有可能这样做吗?如果是,语法是什么?在Puppet中,类a::b可以通过继承关键字继承类a。这允许类a::b“扩展”类a 请注意,Puppet建议您在需要时很少这样做。特别是,通过继承可以实现的大部分功能也可以通过使用include函数只包含基类来实现。有关更多信息,请参阅文档 如果您确实选择使用继承,则会首先自动声明类a;类a成为类a::b的父范围,因此它接收所有变量和资源默认值的副本;类a::b中的代码有权重写在类a中设置的资源属性 使用此模式,类a

我需要从不同的Puppet模块扩展一个类。有可能这样做吗?如果是,语法是什么?

在Puppet中,类a::b可以通过
继承
关键字继承类a。这允许类a::b“扩展”类a

请注意,Puppet建议您在需要时很少这样做。特别是,通过继承可以实现的大部分功能也可以通过使用include函数只包含基类来实现。有关更多信息,请参阅文档

如果您确实选择使用继承,则会首先自动声明类a;类a成为类a::b的父范围,因此它接收所有变量和资源默认值的副本;类a::b中的代码有权重写在类a中设置的资源属性

使用此模式,类a::b也可以使用类a中的变量作为其一个类参数的默认值。这导致了“params模式”,其中params.pp文件用于设置类默认值

下面的简单代码示例演示了所有这些功能:

class a {
  File {
    mode => '0755',
  }
  file { '/tmp/foo':
    ensure => absent,
  }
  $x = 'I, Foo'
}

class a::b (
  $y = $a::x  # default from class a.
) inherits a {

  # Override /tmp/foo's ensure
  # and content attributes.

  File['/tmp/foo'] {
    ensure  => file,
    content => $y,
  }

  # Both /tmp/foo and /tmp/bar
  # will receive the default file
  # mode of 0755.

  file { '/tmp/bar':
    ensure => file,
  }
}
并使用Rspec表示目录的预期结束状态:

describe 'a::b' do
  it 'overrides ensure attribute' do
    is_expected.to contain_file('/tmp/foo').with({
      'ensure'  => 'file',
    })
  end
  it 'inherits content from $x' do
    is_expected.to contain_file('/tmp/foo').with({
      'content' => "I, Foo",
    })
  end
  it 'file defaults inherited' do
    is_expected.to contain_file('/tmp/foo').with({
      'mode' => '0755',
    })
    is_expected.to contain_file('/tmp/bar').with({
      'mode' => '0755',
    })
  end
end
测试通过:

a::b
  overrides ensure attribute
  inherits content from $x
  file defaults inherited

Finished in 0.15328 seconds (files took 1.2 seconds to load)
3 examples, 0 failures
关于“plusignment”的注记


如文档中所述,在重写作为数组的资源属性时,可以使用
+>
“plusignment”操作符将其添加到该数组,而不是替换。这是一个很少使用的特性,但应该在本文中提及。请参阅上面的链接以获取代码示例。

答案很好,但仍然值得注意的是,从3.x版本开始,Puppet就不鼓励类继承,从4.x版本开始,Puppet就不鼓励类继承。是的,我说过要注意Puppet关于何时使用继承和何时不使用继承的建议。我想这还是意见的问题?克雷格·邓恩(Craig Dunn)在2012年5月发表的《角色与档案》(roles&profiles)一文中对继承有一个有趣的用法——是的,类继承仍然被认为是可以的。在2012年(v3推出前后),类继承通常不被认为是可以的,但当时的观点可能比现在更加多样。在我的木偶经验中(可以追溯到0.24),当
include
可行时,从来没有一个很好的理由选择类继承。事实上,这至少早在Puppet文档中就已经明确表达出来了,尽管当时的文档不承认params类模式(这也不例外!)。根据这次讨论,我编辑了答案,以突出地警告读者Puppet不建议继承。尽管可以这样做,几乎可以肯定,您不需要扩展Puppet类,尤其是来自不同模块的类。Puppet语言规范对于此类文档来说实际上是相当可读的。它还说明了此功能的(很少)适当用途。