Назад | Перейти на главную страницу

Puppet: включить другие файлы в зависимости от имени хоста

Я пытаюсь заставить что-то вроде этого работать в моем манифесте 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' {