Puppet – Using virtual resources to prevent duplicated resource declaration

When your Puppet setup is getting larger, you must come across the duplicated resource declaration error.

We are not allowed to declare the same resource more than one time!

So Puppet introduces the virtual resource to solve this problem. A virtual resource will not be sent to the Puppet client until it is realized. Now, we could specify a virtual resource and mark it non-virtual as many times as you want in a configuration.

For example: I have a my_packages class which contains all the some package resources. It only contains virtual resources so any other class include this would do nothing.

class my_packages {
  # Standalone virtual package resources
  @package {[
      ensure => installed,

  # Virtual custom resource for installing make
  define make {
    realize(Package['gcc'], Package['gcc-c++'], Package['autoconf'], Package['automake'], Package['make'])
  @make{ 'make': }

  # Virtual custom resource for installing openssl
  define openssl {
  @openssl{ 'openssl': }


I have another class which specify a build server configuration.

class build_server {
  include my_packages

  # Install git and gcc
  realize(Package['git'], Package['gcc'])

  # Install all packages for make


So this Puppet client may have other configuration other than the build server spec and that may also require the gcc or make packages. But since we could realize virtual resources more than once, the duplicated resource declaration error no longer exists.

Done =)

Reference: Puppet Labs Documentation – Virtual Resource Design Patterns


One thought on “Puppet – Using virtual resources to prevent duplicated resource declaration”

  1. Of all the articles I have read on Virtual Resources, this is the most simple and precise explanation. Thank you very much for this.


Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.