我试图得到这样的东西在我的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' {