Edd, On 14.12.2011, at 11:54, Edd Grant wrote:
> 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? I was referring to exec "check_unpacked_archive_exists_$name" I only wanted to make clear that the command always returns exitcode 0. Nothing wrong here. > > 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. > -- 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.