Я пытаюсь заставить что-то вроде этого работать в моем манифесте Puppet:
if $hostname == 'host1' || $hostname == 'host2' {
# Modified config.txt for portrait mode.
file { '/boot/config.txt' :
ensure => present,
mode => '0755',
source => 'puppet://puppet/files/boot/config.txt.portrait',
}
} else {
# Normal config.txt for landscape mode.
file { '/boot/config.txt' :
ensure => present,
mode => '0755',
source => 'puppet://puppet/files/boot/config.txt.landscape',
}
}
Однако это не удается. Как лучше всего, в зависимости от имени хоста, включать разные файлы?
Альтернативный синтаксис - использовать селектор в исходном параметре.
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 $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 =~ /^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' ]
}
}
У нас есть два разных типа файлов конфигурации chronyd: один для всех обычных машин и один для всех 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',
},
С уважением,
Адаил
Мне пришлось использовать "или" вместо ||:
if $hostname == 'host1' or $hostname == 'host2' {