Thanks for the response Paul, I took a look at ensure_packages and it seems useful, but it of course has the same drawback as using defined, in that it'll only work if all modules use it.
I've reduced my problem to the following. I created two modules, module1 and module2 as follows:
modules/module1/manifests/init.pp:
define module1::before {
package { 'mod_ssl': ensure => present }
}
modules/module2/manifests/init.pp:
define module2::after {
if ! defined(Package['mod_ssl']) {
package { 'mod_ssl': ensure => present }
}
}
and in my main manifest, I have the following which works:
module1::before {'test': }
module2::after {'test': }
but if I change around the order, I receive an error:
module2::after {'test': }
module1::before {'test': }
Error: Duplicate declaration: Package[mod_ssl] is already declared in file /tmp/vagrant-puppet/modules-0/mod2/manifests/init.pp at line 7; cannot redeclare on node vagrant
of course this happens because module 2 performs a check to only require the mod_ssl package if it isn't defined, but module 1 has no such check, so if module 1 is included after module 2, it ends up duplicating the mod_ssl resource.
I've tried resolving this by using the
require directive, but it doesn't seem to work:
module2::after {'test':
require => Module1::Before['test']
}
module1::before {'test': }
Can anyone tell me how I can fix this, and have the code in module1 included before module2, regardless of the order they appear in the file? I thought that's what the
require directive would enforce, but I must be using it incorrectly, since it doesn't seem to work for me in this instance. if I can solve this small issue, I can fix my larger problem without needing to modify the code in either module, which is what I'd prefer. Thanks for any help
Adam