我为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){…”。 这样,我可以将它包含在任何机器上,只有在它应该运行时才会运行。