我对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)
我认为在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 {
这将提供我所需要的并解决问题。
谢谢大家!