blob: 9d9292fdca4e1ba946959b5cd800190f196fa369 [file] [log] [blame]
=============================================================
reclass recursive external node classification
=============================================================
reclass is © 20072013 martin f. krafft <madduck@madduck.net>
and available under the terms of the Artistic Licence 2.0
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Please make sure to read the generic information in the README file first, or
alongside this document.
Quick start with Salt
~~~~~~~~~~~~~~~~~~~~~
The following steps should get you up and running quickly. You will need to
decide for yourself where to put your reclass inventory. This can be
/etc/reclass, or it could be /srv/salt, for instance if /srv/salt/states is
where your Salt file_roots live. The following shall assume the latter.
Or you can also just look into ./examples/salt of your reclass checkout,
where the following steps have already been prepared.
/…/reclass refers to the location of your reclass checkout.
0. Run 'make' in the root of the reclass checkout (see the section
'Installation' in the README file for the reason).
1. Symlink /…/reclass/adapters/salt to /srv/salt/states/reclass. This is not
at all required, because Salt interfaces with reclass as a Python module,
but it's handy to have the inventory within reach.
2. Copy the two directories 'nodes' and 'classes' from the example
subdirectory in the reclass checkout to /srv/salt/states
If you prefer to put those directories elsewhere, you can create
/srv/salt/states/reclass-config.yml with contents such as
storage_type: yaml_fs
nodes_uri: /srv/reclass/nodes
classes_uri: /srv/reclass/classes
Note that yaml_fs is currently the only supported storage_type, and it's
the default if you don't set it.
Again, this isn't really required, but it's good to get you started. If
you really put your inventory into /srv/reclass or /etc/reclass, you'll
tell the Salt master later.
3. Check out your inventory by invoking
./reclass --top
which should return all the information about all defined nodes, which is
only 'localhost' in the example. This is essentially the same information
that you would keep in your top.sls file.
4. See the pillar information for 'localhost':
./reclass --pillar localhost
This is the so-called pillar-data for the named host.
5. Now add reclass to /etc/salt/master, like so:
master_tops:
[…]
reclass:
inventory_base_uri: /srv/salt
ext_pillar:
reclass:
inventory_base_uri: /srv/salt
Currently, there is no way to unify these configuration data, but it's
hardly much to duplicate. In the future, I may provide for a global
'reclass' key, but for now you will have to add the data twice.
Now restart your Salt master and make sure that reclass is in the
PYTHONPATH, so if it's not properly installed (but you are running it
from source), do this:
PYTHONPATH=/…/reclass /etc/init.d/salt-master restart
6. Provided that you have set up 'localhost' as a Salt minion, the following
commands should now return the same data as above, but processed through
salt:
salt localhost pillar.items # shows just the parameters
salt localhost state.show_top # shows only the states (applications)
Alternatively, if you don't have the Salt minion running yet:
salt-call pillar.items # shows just the parameters
salt-call state.show_top # shows only the states (applications)
7. You can also invoke reclass directly, which gives a slightly different
view onto the same data, i.e. before it has been adapted for Salt:
/…/reclass.py --pretty-print --inventory
/…/reclass.py --pretty-print --nodeinfo localhost
Integration with Salt
~~~~~~~~~~~~~~~~~~~~~
reclass hooks into Salt at two different points: master_tops and ext_pillar.
For both, Salt provides plugins. These plugins need to know where to find
reclass, so if reclass is not properly installed (but you are running it
from source), make sure to export PYTHONPATH accordingly before you start your
Salt master.
Salt has no concept of "nodes", "applications", "parameters", and "classes".
Therefore it is necessary to explain how those correspond to Salt. Crudely,
the following mapping exists:
nodes hosts
classes - [*]
applications states
parameters pillar
[*] See Salt issue #5787 for steps into the direction of letting reclass
provide nodegroup information.
Whatever applications you define for a node will become states applicable to
a host. If those applications are added via ancestor classes, then that's
fine, but currently, Salt does not do anything with the classes ancestry.
Similarly, all parameters that are collected and merged eventually end up in
the pillar data of a specific node.
However, the pillar data of a node include all the information about classes
and applications, so you can use them to target your Salt calls at groups of
nodes defined in the reclass inventory, e.g.
salt -I __reclass__:classes:salt_minion test.ping
Unfortunately, this does not work yet, please stay tuned, and let me know
if you figure out a way. Salt issue #5787 is also of relevance.
It will also be possible to include Jinja2-style variables in parameter
values. This is especially powerful in combination with the recursive merging,
e.g.
parameters:
motd:
greeting: Welcome to {{ grains.fqdn }}!
closing: This system is part of {{ realm }}
Now you just need to specify realm somewhere. The reference can reside in
a parent class, while the variable is defined e.g. in the node.
This is also not yet working. The main reason is that the expansion cannot
happen at the YAML-file level, because that would cast most types to strings.
Instead, the interpolation needs to happen at the data structure level inside
reclass, or maybe at the adapter level, reusing the templating of Salt. This
will require some more thought, but it's on the horizon