木偶 – 在另一个类中重新启动一个服务

我对Puppet比较陌生,但是到目前为止,我认识到它是一个非常强大的工具。

举一个简单的例子,假设我有一个模块“ntp”在模块ntp我有三个类:

  • class ntp – 从发行包提供程序安装包,设置启动服务的信息等
  • class ntp :: client – 创buildconfiguration文件以使用本地ntp服务器,停止ntp,强制ntpupdate并启动ntp服务
  • class ntp :: server – 创buildconfiguration文件,使我的本地ntp服务器,停止ntp,强制ntpupdate(在初始configuration),并启动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) 

我认为在ntp类中定义服务并在类ntp :: client和ntp :: server的类ntp中调用该服务会更简单,更简单。 基本上,由于多个平台(基于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**], } 

我似乎记得在文档里读到这个可以完成的事情,但是我似乎再也找不到了。 在我collections的所有东西中,我没有collections这本书!

任何build议,非常感谢。 提前致谢。

编辑另外,我正在使用事实和shell来设置操作系统的包名称和服务名称的参数。 我没有在示例代码中包含这些信息,因为它工作正常,似乎是不必要的混乱。

我这样做了。 使用ENC或Hiera进行基于服务器名称或angular色的查找,并决定是否包含ntp :: server或whatnot,可能会更简洁一些,但这相当简单,不需要额外的软件或安装程序。

请记住,木偶的inheritance模式是不正常的。 除非你使用它非常简单,否则你将会遇到麻烦。 我不会在任何模块中多次inheritance。

 class ntp { include ntp::install, ntp::config, ntp::sevice Class['ntp::install'] -> Class['ntp::config'] ~> Class['ntp::service'] } class ntp::config { file { 'ntp.conf': ensure => present, content => template('ntp/ntp.erb'), } } class ntp::config::server inherits ntp::config { File['ntp.conf'] { content => template('ntp/ntp.conf.server.erb'), } } node basenode { include ntp } node /^ntp\d+/ inherits basenode { include ntp::config::server } 

我偶然发现木偶自己认为是合适的解决办法。

我已经读过应该避免inheritance,但是有一个例外,就是模块中的类 – 根据Puppet Style-Guide-Class Inheritance

由于这些是编写软件的人,我认为这是最好的解决scheme。

基本上,如果我有ntp类中的上述包和服务定义,当我定义类ntp ::服务器时,我会执行以下操作:

 class ntp::server inherits ntp { 

这将提供我所需要的并解决问题。

谢谢大家!