Why on earth in 8 years the Puppet Gods have kept ignoring this very basic and common need, they only know.
In a nutshell, I have a variable
$mypath='/opt/oracle/fmw11_1_1_6'
file { "$mypath":
ensure => directory,
owner => 'soa'
}
This will of course fail if /opt and /opt/oracle have not been already defined.
Of course since $mypath is a configuration value there is no way I can hardcode all the parents directories.
Hence I am screwed, and Puppet doesn't offer me any way around.
I can think of only one elegant way, that is writing a Ruby function (I am not good in Puppet stinky DSL) "pathExpand" to transform a full path into an array of his components:
assert [ '/opt', '/opt/oracle', '/opt/oracle/fmw11_1_1_6' ] = pathExpand('/opt/oracle/fmw11_1_1_6')
and a define "conditionalDirectory($mypath ):
if (! defined($mypath)) {
file { "$mypath":
ensure => directory,
}
}
All this sucks, but not as much as Puppet DSL anyway.
This is a Puppet solution (hack) to the problem:
define common::mkdirp( $owner = 'root', $group = 'root', $exec_path = '/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin') { exec { "create ${name}": command => "mkdir -p ${name}", creates => $name, path => $exec_path, } common::ownership { $name: user => $owner, group => $group, exec_path => $exec_path, require => Exec["create ${name}"] } } define common::ownership( $user, $group = undef, $dir = $name, $exec_path = '/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin' ) { $real_group = $group ? { undef => $user, default => $group } exec { "full '${dir}' directory ownership for ${user}:${real_group}": path => $exec_path, command => "chown -R ${user}:${real_group} ${dir}", unless => "test `find ${dir} -user ${user} -group ${real_group} | wc -l` -eq `find ${dir} | wc -l`", } }
No comments:
Post a Comment