Sorry for the delayed reply.
On 05/06/2013, at 11:51 PM, jcbollinger wrote:
Sorry, I should have been clearer that this occurs when Package[package-434] IS declared elsewhere. "!defined(Package[package-434])" therefore is false, so just by referencing the existing declaration within the defined() call it seems to incite an implicit dependency.
If that's really what's happening then you should be able to create a simple test case that demonstrates it. That would be a worthy subject for a bug report.Sorry, I should have been clearer that this occurs when Package[package-434] IS declared elsewhere. "!defined(Package[package-434])" therefore is false, so just by referencing the existing declaration within the defined() call it seems to incite an implicit dependency.
Is this implicit dependency expected behaviour or am I doing something Bad(tm)?
Both.Supposing that the target package is not declared elsewhere (so that the !defined() condition is true) the definition will declare the package itself to ensure it absent, and in that case you would expect a relationship between the defined-type instance and the resource declared by it. If elsewhere you have specific references to that package, applicable resource parameter defaults, or collectors that will match that package, then you can get relationships with it that are not evident from the defined type body.
On the other hand, defined() is evil. Do not use it. Ever.
define myapp ($requested_package){
package { $requested_package:
ensure => present
}
define package_cleanup {
$installed_package = $title
if $installed_package != $requested_package {
package { $installed_package:
ensure => purged
}
}
}
# assuming a facter fact named 'installed_packages'
package_cleanup { split($::installed_packages, ','): }
}
I don't much like that general approach in the first place on account of the $requested_package parameter. That you encounter difficulty when you try something a bit dodgy should not be surprising.package { $requested_package:
ensure => present
}
define package_cleanup {
$installed_package = $title
if $installed_package != $requested_package {
package { $installed_package:
ensure => purged
}
}
}
# assuming a facter fact named 'installed_packages'
package_cleanup { split($::installed_packages, ','): }
}
In fact, despite my dissatisfaction with your approach, you can indeed do this without defined(), and without even disrupting your current structure very much. Here's one way I think would work:
# This class ensures all known app packages are
# by default purged
class app::packages {
$apps = split($::app_packages, ',')
package { $apps:
ensure => 'purged'
}
}
# Overrides the requested package to be declared
# present instead of purged.
define app::myapp($requested_package) {
include 'app::packages'
Package<| title == $requested_package |> {
ensure => 'present'
}
}
# no separate package_cleanup required
# This class ensures all known app packages are
# by default purged
class app::packages {
$apps = split($::app_packages, ',')
package { $apps:
ensure => 'purged'
}
}
# Overrides the requested package to be declared
# present instead of purged.
define app::myapp($requested_package) {
include 'app::packages'
Package<| title == $requested_package |> {
ensure => 'present'
}
}
# no separate package_cleanup required
OK, I wondered whether we could do something like this however - forgive my naivety - I still can't see how this could be a complete solution without something like defined().
As an example... your above snippet works fine to ensure already installed packages remain installed, but what if we wanted to install a brand new version of app::myapp? Because a 'package' resource with title $requested_package does not yet exist, the Package<||> collector matches no resources and the new package is not installed. The only solution that I can come up with is to check whether such a resource is already defined and, if not, define one.
Your guidance is appreciated.
Tom
--
You received this message because you are subscribed to the Google Groups "Puppet Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to puppet-users+unsubscribe@googlegroups.com.
To post to this group, send email to puppet-users@googlegroups.com.
Visit this group at http://groups.google.com/group/puppet-users?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.