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.