Is it possible to use Puppet to ensure multiple files in a directory are present without defining all of them?

I have a couple hundred one-off servers that have different configuration files that need to be present in a directory. Copies of the files reside on the puppet master.

Within one of my classes I have a default set of configurations that are always pushed to the node, like so:

file { "/etc/someprogram/config/000-default":
  ensure => "present",
  owner => "root",
  group => "root",
  mode =>  0764,
  source => "puppet:///modules/someprogram/000-default",
}

What I would like to have is something like this:

$filearray = directory listing of /etc/puppet/modules/someprogram/files/$fqdn
with each file as an element into array

$filearray.each(
file { "/etc/someprogram/config/$filename":
  ensure => "present",
  owner => "root",
  group => "root",
  mode =>  0764,
  source => "puppet:///modules/someprogram/files/$fqdn/$filename",
}
)

I'm not very familiar with puppet but I'm getting the impression there isn't a way to do this.


Solution 1:

You can do what you are trying with this:

file { "/etc/someprogram/config":
    ensure => directory,
    recurse => remote,
    source => "puppet:///modules/someprogram/files/$fqdn"
    #Other options
}

This will copy all of the files in $fqdn to /etc/someprogram/config, overwriting if they already exist.

Solution 2:

If you want to define multiple files in a directory without recursing the whole directory, you can use an array - like this:

$myfiles = [ "/my/dir/file1", "/my/dir/file2", ]
file { $myfiles:
    ensure => "present",
    owner  => "root",
    group  => "root",
    mode   =>  0644,
    source => "puppet:///modules/someprogram/$fqdn/$name",
}

Of course, with long paths to "/my/dir" or lots of files, it would get a little unwieldy, so in that case you'd be better off creating a define which included the directory path, and just pass the array of filenames to it.

Solution 3:

Here is an example of how I do this:

file {
        [
        '/sys/block/sda/queue/scheduler',
        '/sys/block/sdb/queue/scheduler',
        '/sys/block/sdc/queue/scheduler',
        '/sys/block/sdd/queue/scheduler',
        '/sys/block/sde/queue/scheduler',
        '/sys/block/sdf/queue/scheduler'
        ]:
  ensure  => 'file',
  content => 'deadline',
  group   => '0',
  mode    => '644',
  owner   => '0',
  type    => 'file',
}

In the above example, I am assigning the deadline I/O scheduler to each of the disks on a given server through Puppet.