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

但是,这失败了。 取决于主机名,包括不同文件的最好方法是什么?

另一种语法是在源参数中使用select器。

 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的说法,你可以通过使用select性文件来源进一步缩短它:

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

我有很多这样的例子,在我的清单中,主机types需要相对静态的文件(通常不是hostname级别),但是绝对是$ domain,而自定义的事实是$ site_location(external,datacentre,office等)被广泛使用。

对于你所要求的,我会使用案例陈述 。

  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 } 

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

我们有两种不同types的chronydconfiguration文件:一个用于所有常规机器,一个用于所有在我们的networking中充当NTP服务器的DNS服务器。 我们在这里有一个名称约定,每个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', }, 

最好的祝福,

Adail

我不得不使用“或”而不是||:

  if $hostname == 'host1' or $hostname == 'host2' {