Search code examples
puppet

Checking for custom file using puppet


Part of my puppet manifest checks for the existence of a custom sshd_config. If one is found, I use that. If it's not then I use my default. I'm just wondering if there is a more "puppet" way of doing this

if file("/etc/puppetlabs/puppet/files/${::fqdn}/etc/ssh/sshd_config", '/dev/null') != '' {
  $sshd_config_source = "puppet:///private/etc/ssh/sshd_config"
} else {
  $sshd_config_source = "puppet:///public/etc/ssh/sshd_config"
}

file { '/etc/ssh/sshd_config':
  ensure => 'present',
  mode   => '600',
  source => $sshd_config_source,
  notify => Service['sshd'],
}

This code works but it's a little odd as file I have to give it the full path on the puppet master but when assigning $sshd_config_source I have to use the puppet fileserver path (puppet:///private/etc...).

Is there a better way of doing this?


Solution

  • It's a little known feature of the file type that you can supply multiple source values.

    From the docs:

    Multiple source values can be specified as an array, and Puppet will use the first source that exists. This can be used to serve different files to different system types:

    file { "/etc/nfs.conf":
      source => [
        "puppet:///modules/nfs/conf.$host",
        "puppet:///modules/nfs/conf.$operatingsystem",
        "puppet:///modules/nfs/conf"
      ]
    }
    

    So you should just specify both the specific and the generic file URL, in that order, and Puppet will do the right thing for you.