Previously on ServerFault, it was shown how to test if a Resource was defined: Puppet: Test if Resource is defined, or create it
if defined(File["/tmp/foo"]) {
alert("/tmp/foo is defined")
} else {
alert("/tmp/foo is not defined")
}
I'd like to test if a virtual resource is defined or exists, before realizing it via collector, but it doesn't seem to work with the same syntax.
create_resource('@package',hiera_hash('packages',{}),{})
if !defined(@Package['foo']) {
alert('Hiera screwed up, critical virtual package is missing')
}
# Realize the critical packages
Package<| groups == critical |>
This gets me:
Error: Could not parse for environment production: Virtual (@) can only be applied to a Resource Expression at test.pp..
The reason is that I want to do the realize via create_resources and collectors, and as testing, throw an error if it's not actually creating some critical virtual resource.
Edit 2014/11/12 19:07 UTC One of the answers suggested this instead, but it doesn't work, pasting it here because the answer comment box is too small.
class base::test1 {
@package { 'cookietool':
ensure => 'present',
}
realize(Package['cookietool'])
}
base::test2
has the identical content.
node testbox {
include base::test1
include base::test2
}
This fails with the following error:
Error: Failed to compile catalog for node testbox: Evaluation Error: Error while evaluating a Resource Statement, Duplicate declaration: Package[cookietool] is already declared in file /var/lib/puppet/checkouts/environments/production/modules/base/manifests/test1.pp:2; cannot redeclare at /var/lib/puppet/checkouts/environments/production/modules/base/manifests/test2.pp:2 at /var/lib/puppet/checkouts/environments/production/modules/base/manifests/test2.pp:2:3 on node testbox