blob: 75da3f1c3aba294b41233d3bf412dce9c7011cd8 [file] [log] [blame]
==================
reclass operations
==================
Data merging
------------
While |reclass| has been built to support different storage backends through
plugins, currently only the ``yaml_fs`` storage backend exists. This is a very
simple, yet powerful, YAML-based backend, using flat files on the filesystem
(as suggested by the ``_fs`` postfix).
``yaml_fs`` works with two directories, one for node definitions, and another
for class definitions. It is possible to use a single directory for both, but
that could get messy and is therefore not recommended.
Files in those directories are YAML-files, specifying key-value pairs. The
following three keys are read by |reclass|:
============ ================================================================
Key Description
============ ================================================================
classes a list of parent classes
appliations a list of applications to append to the applications defined by
ancestors. If an application name starts with ``~``, it would
remove this application from the list, if it had already been
added but it does not prevent a future addition.
E.g. ``~firewalled``
parameters key-value pairs to set defaults in class definitions, override
existing data, or provide node-specific information in node
specifications.
\
By convention, parameters corresponding to an application
should be provided as subkey-value pairs, keyed by the name of
the application, e.g.::
applications:
- ssh.server
parameters:
ssh.server:
permit_root_login: no
============ ================================================================
|reclass| starts out reading a node definition file, obtains the list of
classes, then reads the files corresponding to these classes, recursively
reading parent classes, and finally merges the applications list and the
parameters.
Merging of parameters is done recursively, meaning that lists and dictionaries
are extended (recursively), rather than replaced. However, a scalar value
*does* overwrite a dictionary or list value. While the scalar could be
appended to an existing list, there is sane default assumption in the context
of a dictionary, so this behaviour seems the most logical.
Parameter interpolation
------------------------
Parameters may reference each other, including deep references, e.g.::
parameters:
location: Munich, Germany
motd:
header: This node sits in ${location}
for_demonstration: ${motd:header}
dict_reference: ${motd}
After merging and interpolation, which happens automatically inside the
storage modules, the ``for_demonstration`` parameter will have a value of
"This node sits in Munich, Germany".
Types are preserved if the value contains nothing but a reference. Hence, the
value of ``dict_reference`` will actually be a dictionary.
You should now be ready to :doc:`use reclass <usage>`!
.. include:: substs.inc