How to extract a puppet virtual resource declaration from the class definition

puppet

I have a question about virtual resources in puppet. If I have:

class foo::virtual
{
  define foo () {
    custom_resource { $name:
      <attributes>,
      }
  }
  @foo { '1st_foo':
    <attributes>,
  }
}

I can realize(Foo::Virtual::Foo['1st_foo']) in a node declaration.

However, I would like to extract the specification of each virtual foo into a separate location, somewhere apart from the specification of class foo::virtual and define foo().

By way of analogy, I have a class called common::data that provides default values for various variables:

  class common::data {
    $barList = [ 'a','b','z']
  }

Is there some way I can declare @foo { '2nd_foo': } from within common::data? And then refer to that in a node declaration?

Best Answer

Yes, you can use that define outside the class it's created in, but you may need to include the class to ensure the define is parsed first, and the name of the individual resource is based on the class the define is in, not where the class is called.

Here's a complete working tested example (tested on CLI with puppet apply and correct nodename):

class foo::virtual {
  define foo() { notify { "test${title}": message => "realized foo ${title}" } }
  @foo { '1st_foo': }
}

class common::data {
  include foo::virtual
  @foo::virtual::foo { '2nd_foo': }
}

node default {
  include common::data
  realize(Foo::Virtual::Foo['1st_foo'])
  realize(Foo::Virtual::Foo['2nd_foo'])
}

Output confirms that both happen:

notice: realized foo 1st_foo
notice: realized foo 2nd_foo