Martin, r.e. your comment: "The command will only get executed in case that $targeDir/$appName does not exists. The command will always return 0 !!" can I ask what you were referring to here? was it the exec "check_unpacked_archive_exists_$name"? I tested the statement in the onlyif and that definitely returns 0 when the directory is absent and 1 when the directory is present. I'm not quite sure what to do here to correct this?
Cheers, Edd On Dec 14, 10:18 am, Edd Grant <e...@eddgrant.com> wrote: > Wow - thanks for the super quick reply Martin. Will try out your > suggestions. > > Cheers, > > Edd > > On Dec 14, 10:16 am, Martin Alfke <tux...@gmail.com> wrote: > > > > > > > > > Hi, > > > my answer is inline.. > > > On 14.12.2011, at 11:09, Edd Grant wrote: > > > > Hi All, > > > > I'm trying to write a module which unpacks an archive to a specified > > > location, the idea is as follows: > > > > Let's say I'm trying to deploy an archive of grails-1.3.7 > > > Check that a directory exists at $targetDir/grails-1.3.7 > > > If it does, do nothing > > > If it doesn't then do the following... > > > Copy grails-1.3.7.zip from the module source to $targetDir > > > Unpack to $targetDir/grails-1.3.7 > > > Delete the archive so we don't end up with mess in our directories > > > I have this mostly working, i.e. the code below performs all of the steps > > > above successfully, but for some reason I cannot stop steps 4 and onwards > > > from happening every time Puppet applies the manifests, irrespective of > > > whether the $targetDir/grails-1.3.7 directory already exists. > > > > Here's the code > > > Module code: modules/archive/unpack.pp > > > > define archive::unpack($archiveName, > > > $appName, > > > $archiveDir, > > > $targetDir, > > > $pathFolder, > > > $owner = "root", > > > $group = "root", > > > $mode = "644") { > > > > #Set the extraction command appropriately based on the archive type. > > > $command = $archiveName ? { > > > /(^.*\.tar\.gz$)|(^.*\.tgz$)/ => "/bin/tar zxf > > > $targetDir/$archiveName", > > > /(^.*\.tar$)/ => "/bin/tar xf $targetDir/$archiveName", > > > /^.*\.zip$/ => "/usr/bin/unzip $targetDir/$archiveName", > > > default => "Error: Could not detect archive type from archive name > > > ($archiveName), cannot unpack. Supported types: .tar.gzip, .zip", > > > } > > > > # Check if the unpacked archive directory exists > > > # the idea here was to have all subsequent actions > > > # subscribe to the outcome of this check so that the archive > > > # would only be copied, unpacked, chowned and chmodded if > > > # the directory specified by this exec did not exist. This doesn't seem > > > # to work though since "copy_archive_$name" always seems to be invoked > > > # irrespective of the outcome of the onlyif condition in this exec. > > > exec { "check_unpacked_archive_exists_$name": > > > command => "/bin/echo '$targetDir/$appName does not exist, it will be > > > created.'", > > > cwd => $targetDir, > > > creates => "$targetDir/$appName", > > > onlyif => "/usr/bin/test ! -d $targetDir/$appName", > > > logoutput => true, > > > } > > > The command will only get executed in case that $targeDir/$appName does not > > exists. > > The command will always return 0 !! > > > > # copy file from puppet master to local system > > > file { "copy_archive_$name": > > > path => "$targetDir/$archiveName", > > > source => "$archiveDir/$archiveName", > > > replace => false, > > > subscribe => Exec["check_unpacked_archive_exists_$name"], > > > } > > > Here you subscribe to the exec resource. > > Exec resource will get parsed but the command will not run > > What you want is > > require => Exec[...] > > > Using require instead of subscribe will make sure that the file resource > > will only be done if the exec resource command is executed. > > > > # extract local file > > > exec { "unpack_archive_$name": > > > command => $command, > > > cwd => $targetDir, > > > creates => "$targetDir/$appName", > > > refreshonly => true, > > > logoutput => true, > > > subscribe => File["copy_archive_$name"], > > > } > > > Same here: use require instead of subscribe. > > > > # delete copied archive > > > exec { "delete_copied_archive_$name": > > > command => "/bin/rm -f $targetDir/$archiveName", > > > cwd => "$targetDir", > > > subscribe => Exec["unpack_archive_$name"], > > > logoutput => true, > > > } > > > } > > > Same here. > > > Kind regards, > > > Martin > > > > Invocation code: > > > > class grails { > > > > $appName = "grails-2.0.0.M1" > > > $archiveName = "$appName.zip" > > > $archiveDir = "puppet:///modules/grails" > > > $targetDir = "/usr/local/java" > > > $pathFolder = "bin" > > > $owner = root > > > $group = dev > > > $mode = 6775 > > > > archive::unpack { "install_$appName": > > > archiveName => $archiveName, > > > appName => $appName, > > > archiveDir => $archiveDir, > > > targetDir => $targetDir, > > > pathFolder => $pathFolder, > > > owner => $owner, > > > group => $group, > > > mode => $mode, > > > } > > > } > > > > The frustrating thing is that the exec called > > > "check_unpacked_archive_exists_$name" is definitely only firing when it > > > finds the sought folder to be missing, which is what I want it to do. > > > What I don't understand is why the file called "copy_archive_$name" which > > > subscribes to that exec gets fired everytime. I can't help but think that > > > this would be made much much easier if only the file resource supported > > > 'onlyif'... but while it doesn't does anyone have any insight as to why > > > I'm seeing this issue? > > > > Cheers, > > > > Edd > > > > -- > > > Web:http://www.eddgrant.com > > > Email: e...@eddgrant.com > > > Mobile: +44 (0) 7861 394 543 > > > > -- > > > You received this message because you are subscribed to the Google Groups > > > "Puppet Users" group. > > > To post to this group, send email to puppet-users@googlegroups.com. > > > To unsubscribe from this group, send email to > > > puppet-users+unsubscr...@googlegroups.com. > > > For more options, visit this group > > > athttp://groups.google.com/group/puppet-users?hl=en. -- You received this message because you are subscribed to the Google Groups "Puppet Users" group. To post to this group, send email to puppet-users@googlegroups.com. To unsubscribe from this group, send email to puppet-users+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/puppet-users?hl=en.