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 |>