I would like to collect a variable over different classes in Puppet. Is this possible?

For example, I want to assign two classes to a node:

class { "webapplication1": url => 'webapp1.example.com' }
class { "webapplication2": url => 'webapp2.example.com' }

Then I would like to include a different class, webserver which sets up two virtual hosts for each of these two classes. Therefore it should get the two URL variables from both classes. I do not want to pass the URLs as parameters to the new class. For further fun, maybe sometimes I only want to add one class, or some other time I want to add a completely different class (all only with the similarity that they have a url parameter.

How can I collect these? I thought about adding a tag to each class and then collecting them via a resource collector (ok, does not work with classes). But how do I access their parameters?

So then I rather create a defined resource for webapplications, e.g.

webapplication { "webapplication1": url => 'webapp1.example.com' }
webapplication { "webapplication2": url => 'webapp2.example.com' }

But how would I then collect all urls from all webapplications?

Webapplication <| |>

This does not give me any functionality, it seems. Should I put a class around the webapplications which will then create resources?

class webapps (
  Hash $webapps,
) {
  $webapps.each | String $appname, String $parameters | {
    webapp { $appname: 
      * => $parameters,

    apache::vhost { $parameters["url"]:

class { webapps: 
    webapps => {
      'webapplication1' = {
        'url' => 'webapp1.example.com'
      'webapplication2' = {
        'url' => 'webapp2.example.com'

(not tested and might look simpler in YAML...). And tips how to start would be greatly appreciated. Just don't know how to nicely do this.



PuppetDB was designed to do that. It might not look as the simplest solution, but you can easily expand it to search on multiple nodes etc.

Puppetdbquery provide nice API for accessing data in PuppetDB. Given the example above you could use something like:

query_resources('Class["webapps"]{ hostname = 'localhost' }', 'url')

puppet agent generates list of resources and facts being used on given node, this data are stored in PuppetDB. So, your're not performing a local query (which is AFIK not possible), so propagating some change might take a while (depending on agent's run interval).

  • Well, I know of PuppetDB, but using it for this purpose seems a bit complicating. I want to avoid needing multiple puppet runs. So I guess this needs some more manual work... well unfortunate but might not be helped. Thanks. – Hellstorm Nov 22 '16 at 19:57

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.