blob: 08b34e5fc4f4aa64cf01d6c96ce5b33c128d8994 [file] [log] [blame]
martin f. krafft8acd49d2013-08-26 21:22:25 +02001==================
2reclass operations
3==================
4
martin f. krafftf4320532013-11-30 17:00:37 +01005YAML FS storage
6---------------
martin f. krafft8acd49d2013-08-26 21:22:25 +02007While |reclass| has been built to support different storage backends through
8plugins, currently only the ``yaml_fs`` storage backend exists. This is a very
9simple, yet powerful, YAML-based backend, using flat files on the filesystem
10(as suggested by the ``_fs`` postfix).
11
12``yaml_fs`` works with two directories, one for node definitions, and another
martin f. krafft16c93802013-11-30 13:23:16 +010013for class definitions. The two directories must not be the same, nor can one
14be a parent of the other.
martin f. krafft8acd49d2013-08-26 21:22:25 +020015
16Files in those directories are YAML-files, specifying key-value pairs. The
17following three keys are read by |reclass|:
18
19============ ================================================================
20Key Description
21============ ================================================================
22classes a list of parent classes
23appliations a list of applications to append to the applications defined by
24 ancestors. If an application name starts with ``~``, it would
25 remove this application from the list, if it had already been
26 added — but it does not prevent a future addition.
27 E.g. ``~firewalled``
28parameters key-value pairs to set defaults in class definitions, override
29 existing data, or provide node-specific information in node
30 specifications.
31 \
32 By convention, parameters corresponding to an application
33 should be provided as subkey-value pairs, keyed by the name of
34 the application, e.g.::
35
36 applications:
37 - ssh.server
38 parameters:
39 ssh.server:
40 permit_root_login: no
martin f. krafftd48a46e2014-01-03 14:32:49 +130041environment only relevant for nodes, this allows to specify an "environment"
42 into which the node definition is supposed to be place.
martin f. krafft8acd49d2013-08-26 21:22:25 +020043============ ================================================================
44
martin f. krafft14c81f52014-02-28 17:10:49 +010045Classes files may reside in subdirectories, which act as namespaces. For
46instance, a class ``ssh.server`` will result in the class definition to be
47read from ``ssh/server.yml``. Specifying just ``ssh`` will cause the class
48data to be read from ``ssh/init.yml`` or ``ssh.yml``. Note, however, that only
49one of those two may be present.
50
51Nodes may also be defined in subdirectories. However, node names (filename)
52must be unique across all subdirectories, and |reclass| will exit with an
53error if a node is defined multiple times. Subdirectories therefore really
54only exist for the administrator's local data structuring. They may be used in
55mappings (see below) to tag additional classes onto nodes.
martin f. krafft1f11ede2013-11-30 16:48:00 +010056
martin f. krafftf4320532013-11-30 17:00:37 +010057Data merging
58------------
59|reclass| has two modes of operation: node information retrieval and inventory
60listing. The second is really just a loop of the first across all defined
61nodes, and needs not be further described.
martin f. krafft8acd49d2013-08-26 21:22:25 +020062
martin f. krafftf4320532013-11-30 17:00:37 +010063When retrieving information about a node, |reclass| first obtains the node
64definition from the storage backend. Then, it iterates the list of classes
65defined for the node and recursively asks the storage backend for each class
66definition (unless already cached).
67
68Next, |reclass| recursively descends each class, looking at the classes it
69defines, and so on, until a leaf node is reached, i.e. a class that references
70no other classes.
71
72Now, the merging starts. At every step, the list of applications and the set
73of parameters at each level is merged into what has been accumulated so far.
74
75Merging of parameters is done "deeply", meaning that lists and dictionaries
martin f. krafft8acd49d2013-08-26 21:22:25 +020076are extended (recursively), rather than replaced. However, a scalar value
77*does* overwrite a dictionary or list value. While the scalar could be
martin f. krafft6e0040d2014-06-04 12:24:18 +020078appended to an existing list, there is no sane default assumption in the
79context of a dictionary, so this behaviour seems the most logical. Plus, it
80allows for a dictionary to be erased by overwriting it with the null value.
martin f. krafft8acd49d2013-08-26 21:22:25 +020081
martin f. krafftf4320532013-11-30 17:00:37 +010082After all classes (and the classes they reference) have been visited,
83|reclass| finally merges the applications list and parameters defined for the
84node into what has been accumulated during the processing of the classes, and
85returns the final result.
86
martin f. krafft3b10e802013-11-26 23:30:10 +010087Wildcard/Regexp mappings
88------------------------
89Using the :doc:`configuration file <configfile>`, it is also possible to
90provide a list mappings between node names and classes. For instance::
91
92 class_mappings:
93 - \* default
94 - /^www\d+/ webserver
95 - \*.ch hosted@switzerland another_class_to_show_that_it_can_take_lists
96
97This will assign the ``default`` class to all nodes (make sure to escape
98a leading asterisk (\*) to keep YAML happy), ``webserver`` to all nodes named
99``www1`` or ``www999``, and ``hosted-in-switzerland`` to all nodes whose names
100end with ``.ch`` (again, note the escaped leading asterisk). Multiple classes
101can be assigned to each mapping by providing a space-separated list (class
102names cannot contain spaces anyway).
103
Andrew Pickfordb803adb2020-06-12 10:53:32 +0200104By default the class mappings regex match is done against the node name. This can
105be changed to do the match against the path of the node file from the classes
106directory, but dropping the .yml extension at the end of the node file. This is
107controlled with the setting class_mappings_match_path. When False (the
108default) the match is done again the node name and when true the match is done
109against the node file path.
110
martin f. krafft010ea272013-11-27 14:08:28 +0100111.. warning::
112
113 The class mappings do not really belong in the configuration file, as they
114 are data, not configuration inmformation. Therefore, they are likely going
115 to move elsewhere, but I have not quite figured out to where. Most likely,
116 there will be an additional file, specified in the configuration file, which
117 then lists the mappings.
118
martin f. krafft2e233ed2013-11-27 13:50:56 +0100119Note that mappings are not designed to replace node definitions. Mappings can
120be used to pre-populate the classes of existing nodes, but you still need to
121define all nodes (and if only to allow them to be enumerated for the
122inventory).
123
martin f. krafft41521eb2013-11-27 14:06:37 +0100124The mapped classes can also contain backreferences when regular expressions
125are used, although they need to be escaped, e.g.::
126
127 class_mappings:
128 - /\.(\S+)$/ tld-\\1
129
martin f. krafft05cbf6b2013-11-28 13:36:29 +0100130Furthermore, since the outer slashes ('/') are used to "quote" the regular
martin f. krafft37b56b62013-12-10 16:04:52 +0100131expression, *any* slashes within the regular expression must be escaped. For
132instance, the following class mapping assigns a ``subdir-X`` class to all
Daniel Dehennin02550e42013-12-27 09:38:14 +1300133nodes that are defined in a subdirectory (using yaml_fs)::
martin f. krafft05cbf6b2013-11-28 13:36:29 +0100134
135 class_mappings:
martin f. krafft37b56b62013-12-10 16:04:52 +0100136 - /^([^\/]+)\// subdir-\\1
martin f. krafft05cbf6b2013-11-28 13:36:29 +0100137
martin f. krafft8acd49d2013-08-26 21:22:25 +0200138Parameter interpolation
139------------------------
140Parameters may reference each other, including deep references, e.g.::
141
142 parameters:
143 location: Munich, Germany
144 motd:
145 header: This node sits in ${location}
146 for_demonstration: ${motd:header}
147 dict_reference: ${motd}
148
149After merging and interpolation, which happens automatically inside the
150storage modules, the ``for_demonstration`` parameter will have a value of
151"This node sits in Munich, Germany".
152
153Types are preserved if the value contains nothing but a reference. Hence, the
154value of ``dict_reference`` will actually be a dictionary.
155
156You should now be ready to :doc:`use reclass <usage>`!
157
158.. include:: substs.inc