Я имел хороший успех с Zenoss. Это делает обычный контрольный материал out-of-the-box (свободная память, загрузка ЦП и т.д. для серверов, таблиц маршрутизации для маршрутизаторов...). Это может быть расширено различными способами (поддерживает плагины Nagios, может быть расширен в Python).
Во всяком случае самое изящное решение состоит в том, чтобы, вероятно, иметь Ваш контролируемый отчет программного обеспечения его состояние через SNMP (существуют различные доступные библиотеки, или Вы могли записать плагин для, например, NetSNMP). Затем любое способное к SNMP контрольное программное обеспечение сможет общаться с ним.
Альтернативным синтаксисом было бы использование селектора в исходном параметре.
file { '/boot/config.txt' :
ensure => present,
mode => '0755',
source => $::hostname?{
'host1' => 'puppet://puppet/files/boot/config.txt.portrait',
'host2' => 'puppet://puppet/files/boot/config.txt.portrait',
default => 'puppet://puppet/files/boot/config.txt.landscape',
},
}
Основываясь на том, что сказал devicenull, вы можете затем сократить его, используя выборочные источники файлов:
# Normal config.txt for landscape mode.
file { '/boot/config.txt' :
ensure => present,
mode => '0755',
source => [
"puppet://puppet/files/boot/config.txt.$hostname", # down the individual hostname if required
"puppet://puppet/files/boot/config.txt.$layouttype", # a layout dimension fact (portrait/landscape)
"puppet://puppet/files/boot/config.txt" # default
],
}
У меня есть много таких примеров в моих манифестах, где относительно статические файлы необходим для типа хоста (не часто до уровня имени хоста), но определенно $ domain, а пользовательский факт $ site_location (внешний, центр обработки данных, офис и т. д.) широко используется.
Для того, о чем вы спрашиваете, я бы использовал Case Statements .
case $hostname {
'host1', 'host2': { # Modified config.txt for portrait mode.
file { '/boot/config.txt' :
ensure => present,
mode => '0755',
source => 'puppet://puppet/files/boot/config.txt.portrait',
}
}
default: {
file { '/boot/config.txt' :
ensure => present,
mode => '0755',
source => 'puppet://puppet/files/boot/config.txt.landscape',
}
} # apply the generic class
}
Мне пришлось использовать "или" вместо ||:
if $hostname == 'host1' or $hostname == 'host2' {
Tuinslak!
Мы решили нашу проблему следующим образом:
if $hostname =~ /^sv-dns./ {
file { '/etc/chrony.conf':
ensure => file,
owner => 'root',
group => 'root',
mode => '0644',
source => [ 'puppet:///modules/basico/conf/ntp_server/chrony.conf_server' ]
}
} else {
file { '/etc/chrony.conf':
ensure => file,
owner => 'root',
group => 'root',
mode => '0644',
source => [ 'puppet:///modules/basico/conf/ntp_server/chrony.conf_client' ]
}
}
У нас есть два различных типа конфигурационных файлов хронометража: один для всех обычных машин и один для всех DNS-серверов, которые действуют как NTP-сервер внутри нашей сети. Здесь у нас есть соглашение об именах, что каждый DNS-сервер имеет имя хоста, начинающееся с "sv-dns". Таким образом, с помощью приведенного выше фрагмента мы можем гарантировать, что каждое имя хоста, которое начинается с "sv-dns", получит имя "chrony".файл conf_server и все остальные серверы получат файл chrony.conf_client.
Если имя вашего хоста исправлено, например dnsmachine.some.domain, вы можете использовать пример, предоставленный @kwiksand:
file { '/boot/config.txt' :
ensure => present,
mode => '0755',
source => $::hostname?{
'host1' => 'puppet://puppet/files/boot/config.txt.portrait',
'host2' => 'puppet://puppet/files/boot/config.txt.portrait',
default => 'puppet://puppet/files/boot/config.txt.landscape',
},
Best regards,
Adail
.