Hi Edd,
On 14.12.2011, at 13:27, Edd Grant wrote:
> Hi Martin,
>
> I have swapped all the subscribes out for requires as per your
> suggestion but copy_archive_$name still runs every time. Any ideas?
The exec check_unpacked_archive_exists_$name is parsed and validated on every
run.
I see two possibilities:
1. make the exec fail if the directory exists.
e.g. command => "/bin/test ! -d $targetDir && mkdir $targetDir"
But: This will put an error in every puppet report.
2. do not remove the archive or touch a file with the same name.
e.g.
command => "/bin/rm -f $targetDir/$archiveName && /usr/bin/touch
$targetDir/$archiveName",
this will work, because the file resource has replace => false.
>
> Code below:
>
> 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",
> }
>
> 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,
> }
>
> # copy file from puppet master to local system
> file { "copy_archive_$name":
> path => "$targetDir/$archiveName",
> source => "$archiveDir/$archiveName",
> replace => false,
> require => Exec["check_unpacked_archive_exists_$name"],
> }
>
> # extract local file
> exec { "unpack_archive_$name":
> command => $command,
> cwd => $targetDir,
> creates => "$targetDir/$appName",
> logoutput => true,
> require => File["copy_archive_$name"],
> }
>
> # delete copied archive
> exec { "delete_copied_archive_$name":
> command => "/bin/rm -f $targetDir/$archiveName",
> cwd => "$targetDir",
> logoutput => true,
> require => Exec["unpack_archive_$name"],
> }
> }
>
>
>
>
> On Dec 14, 11:20 am, Martin Alfke <[email protected]> wrote:
>> 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 <[email protected]> wrote:
>>>> Wow - thanks for the super quick reply Martin. Will try out your
>>>> suggestions.
>>
>>>> Cheers,
>>
>>>> Edd
>>
>>>> On Dec 14, 10:16 am, Martin Alfke <[email protected]> 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: [email protected]
>>>>>> 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 [email protected].
>>>>>> To unsubscribe from this group, send email to
>>>>>> [email protected].
>>>>>> 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 [email protected].
>>> To unsubscribe from this group, send email to
>>> [email protected].
>>> 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 [email protected].
> To unsubscribe from this group, send email to
> [email protected].
> 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 [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/puppet-users?hl=en.