我对 Puppet 比较陌生,但到目前为止意识到它是一个非常强大的工具。
举一个简单的例子,假设我有一个模块“ntp”在模块 ntp 中我有三个类:
我不确定使 ntp 类中的服务定义可用于 ntp::client 和 ntp::server 类的正确方法。
我使用事实来基本上区分不同的操作系统以及包和服务名称。为了避免混乱,我在示例中省略了这一点。
而不是在每个类中都有类似以下内容:
service{ 'ntp':
name => $ntpservice,
ensure => running,
subscribe => File['ntpconf'],
}
package{ 'ntp':
(etc - I think the point has been communicated)
Run Code Online (Sandbox Code Playgroud)
我认为在 ntp 类中定义服务并在类 ntp 中从类 ntp::client 和 ntp::server 调用该服务会更清晰、更容易。基本上,由于多个平台(基于 RHEL 和基于 Debian),软件包和服务的定义可能略有不同。
我更喜欢在 ntp::client 和 ntp::server 中拥有的是这样的:
file{ 'ntpconf':
source => 'puppet:///modules/ntp/ntp.conf',
owner => 'root',
group => 'root',
mode => '0644',
notify => Service[**CALL TO class ntp SERVICE**],
require => Package[**CALL TO class ntp PACKAGE**],
}
Run Code Online (Sandbox Code Playgroud)
我似乎记得前段时间在文档中读到可以做到这一点,但我似乎无法再次找到它。在我添加书签的所有内容中,我没有为这个添加书签!
任何建议都非常感谢。提前致谢。
编辑此外,我使用事实和大小写来设置操作系统的包名称和服务名称的参数。我没有在示例代码中包含该信息,因为它运行良好并且看起来像是不必要的混乱。
我偶然发现了木偶自己认为正确的解决方案。
我读过应该避免继承,但有一个例外,模块内的类 - 根据Puppet Style-Guide -- Class Inheritance中找到的文档
由于这些是编写软件的人,我认为这是最好的解决方案。
基本上,如果我在类 ntp 中有上述包和服务定义,当我定义类 ntp::server 时,我将执行以下操作:
class ntp::server inherits ntp {
Run Code Online (Sandbox Code Playgroud)
这将提供我所需要的并解决问题。
谢谢大家!