я создал базовый класс для всех серверов в марионетке,
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 => ['x.x.x.y', 'x.x.y.y' ],
}
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; вместо того, чтобы делать много предварительной работы, чтобы определить, какие это были машины, и построить условные классы или создать определенный набор классов для включения для каждого именованного хоста, я написал настраиваемый факт Facter, чтобы определить, установлен ли на машине SSD (осматривая /sys/block/sd*/queue/rotational
). Затем я написал класс как «if ($ has_ssd) {...». Таким образом, я могу включить его на любую машину, и он будет работать только в том случае, если должен работать.