Virtual resources
A virtual resource declaration specifies a desired state for a resource without enforcing that state. Puppet manages the resource by realizing it elsewhere in your manifests. This divides the work done by a normal resource declaration into two steps. Although virtual resources are declared one time, they can be realized any number of times, similar to a class.
Purpose
-
Resources whose management depends on at least one of multiple conditions being met.
-
Overlapping sets of resources required by any number of classes.
-
Resources which are managed only if multiple cross-class conditions are met.
-
Searchability via resource collectors, which helps to realize overlapping clumps of virtual resources.
-
Flatness, such that you can declare a virtual resource and realize it a few lines later without having to clutter your modules with many single-resource classes.
Syntax
Virtual resources are used in two steps: declaring and realizing. In this example, the apache class declares a virtual resource, and both the wordpress and freight classes realize it. The resource is managed on any node that has the wordpress or freight classes applied to it.
modules/apache/manifests/init.pp @a2mod { 'rewrite': ensure => present, } # note: The a2mod resource type is from the puppetlabs-apache module.Realize: modules/wordpress/manifests/init.pp realize A2mod['rewrite']Realize again: modules/freight/manifests/init.pp realize A2mod['rewrite']To declare a virtual resource, prepend @ (the “at” sign) to the resource type of a normal resource declaration:@user {'deploy': uid => 2004, comment => 'Deployment User', groups => ["enterprise"], tag => [deploy, web], }To realize one or more virtual resources by title, use the realize function, which accepts one or more resource references:realize(User['deploy'], User['zleslie']) realize function can be used multiple times on the same virtual resource and the resource is managed only one time.User <| tag == web |>If multiple resource collectors match a given virtual resource, Puppet manages only that resource one time.Behavior
A virtual resource declaration does not manage the state of a resource. Instead, it makes a virtual resource available to resource collectors and the realize function. When a resource is realized, Puppet manages its state.
Unrealized virtual resources are included in the catalog, but are marked inactive.
realize function causes a compilation failure when attempting to realize a virtual resource that has not been declared. Resource collectors fail silently when they do not match any resources.include virtual::users User <| groups == admin or group == wheel |>