I frequently find myself using Puppet to expand tarballs in various locations, sometimes fiddling with a directory name here or there. In fact, I do it so often, that I created a “define” for it earlier this week. This could be a little more polished, but in the spirit of sharing first drafts, here goes:
# Small define to expand a tarball at a location; assumes File[$title]
# definition of tarball and installation of pax:
define baselayout::drop_tarball($dest, $dir_name, $dir_sub='') {
# $dest: cwd in which expansion is done
# $dir_name: name of top level directory created in $dest
# $dir_sub: regexp to -s for pax - not supported for .zip archives
if ($dir_sub) {
$regexp = "-s $dir_sub"
} else {
$regexp = ''
}
# CentOS' pax doesn't support "-j" flag; therefore, run pax after
# bzcat in a pipeline. Twiddle path to bzcat as distro-appropriate:
case $operatingsystem {
CentOS: {
$bzcat = "/usr/bin/bzcat"
}
Ubuntu: {
$bzcat = "/bin/bzcat"
}
}
# Choose expansion method based on file suffix:
if (($title =~ /.tar.gz$/) or ($title =~ /.tgz$/)) {
$expand = "/usr/bin/pax -rz $regexp < $title"
} elsif (($title =~ /.tar.bz2$/) or ($title =~ /.tbz$/)) {
$expand = "$bzcat $title | /usr/bin/pax -r $regexp"
} elsif ( $title =~ /.zip$/ ) {
$expand = "/usr/bin/unzip $title"
}
exec { "drop_tarball $title":
command => $expand,
cwd => $dest,
creates => "${dest}/${dir_name}",
require => File[$title],
}
}
The definition is written for Ubuntu and CentOS, assumes pax is installed on the system, and that a file resource for the tarball is defined before the definition is called. Pax is used instead of tar to facilitate renaming the top-level directory of the tarball. Zipped directories are also support, but without rename functionality.
I’ll update a gist as I develop the definition.
Comments welcome.