Puppet: inclua outros arquivos dependendo do hostname

2

Estou tentando fazer algo assim para funcionar no meu manifesto de marionetes:

    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',
        }
    }

No entanto, isso falha. Qual é a melhor maneira de, dependendo do nome do host, incluir arquivos diferentes?

    
por Tuinslak 11.03.2014 / 23:12

5 respostas

6

Uma sintaxe alternativa seria usar um seletor no seu parâmetro de origem.

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',
                    },
}
    
por 12.03.2014 / 18:42
3

Com base no que o devicenull disse, você pode encurtá-lo ainda mais usando fontes de arquivos seletivas:

# 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
    ],
}

Eu tenho muitos exemplos como estes em meus manifestos, onde arquivos relativamente estáticos são necessários para um tipo de host (não com frequência até o nível hostname), mas definitivamente $ domain, e um fato personalizado $ site_location (externo, datacenter, office , etc) é usado extensivamente.

    
por 12.03.2014 / 01:19
1

Para o que você está pedindo, use Declarações de casos .

    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
    }
    
por 12.03.2014 / 18:54
1

Tuinslak!

Resolvemos nosso problema assim:

       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' ]
               }
    }

Temos dois tipos diferentes de arquivos de configuração chronyd: um para todas as máquinas comuns e um para todos os servidores DNS que agem como um servidor NTP dentro de nossa rede. Nós temos uma convenção de nomes aqui, que todo servidor DNS tem o nome do host iniciado com "sv-dns". Portanto, com o snippet acima, podemos assegurar que cada nome de host, cujo nome começa com "sv-dns", receberá o arquivo chrony.conf_server e todos os outros servidores receberão o arquivo chrony.conf_client.

Se o seu nome de host for fixo, por exemplo, dnsmachine.some.domain, você pode usar o exemplo fornecido por @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',
                },

Atenciosamente,

Adail

    
por 29.05.2017 / 21:47
0

Eu tive que usar "ou" em vez de ||:

    if $hostname == 'host1' or $hostname == 'host2' {
    
por 12.03.2014 / 00:26

Tags