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 at > http://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.