傀儡排除模块

我为puppet中的所有服务器创build了一个基类,

class centos_base { include chkconfig include hosts include inittab include nscd include nsswitch include ntp include puppet include syslog::base include ssh # include curp include security include sysctl include sudo include users include vim include yum include rpmforge # include vmware-tools import 'resolver' resolv_conf { default_resolver: domainname => "domain.com", searchpath => ['domain.com'], nameservers => ['xxxy', 'xxyy' ], } import 'nrpe' nrpe_conf { nrpe: listen_address => $ipaddress, nagios_address => 'xx.xx.xx.yy', } } 

和nodes.pp,我包括这个类的所有服务器,对于服务器之一,我想包括这个类,但不包括syslog::base

任何想法如何做到这一点..

尝试这个:

 class centos_base { define includer($exclude=false) { if !$exclude { include $name } } includer{ ["chkconfig", "hosts", ...: } class no_syslog_base inherits centos_base { Includer["syslog::base"] { exclude => true } } ... } 

对于要排除syslog::base服务器:

 node 'special' { include centos_base::no_syslog_base } 

和所有其他服务器:

 node 'normal' { include centos_base } 

把它变成一个定义,并指定一个参数来描述你想排除这个类的原因 – 这可能是因为它是一个虚拟机,或者是一个临时环境,或者其他什么。

我喜欢解决这类问题的方法是让课堂足够聪明,知道不应该在哪里运行。 例如,我有一个只能在具有SSD的机器上运行的类; 而不是做很多前期工作来定义那些机器和构build条件类,或者为每个指定的主机创build一组特定的类,我写了一个自定义的Facter事实来确定机器是否安装了SSD (检查/sys/block/sd*/queue/rotational )。 然后我写了“if($ has_ssd){…”。 这样,我可以将它包含在任何机器上,只有在它应该运行时才会运行。