In 0.10.4 the external_nodes system was upgraded to allow for modular subsystems to be used to generate the top file data for a highstate run on the master.
The old external_nodes option has been removed. The master tops system provides a pluggable and extendable replacement for it, allowing for multiple different subsystems to provide top file data.
Changed in version 3007.0: Masterless minions now support master top modules as well.
Using the new master_tops option is simple:
master_tops:
ext_nodes: cobbler-external-nodes
for Cobbler
or:
master_tops:
reclass:
inventory_base_uri: /etc/reclass
classes_uri: roles
for Reclass
.
master_tops:
varstack: /path/to/the/config/file/varstack.yaml
for Varstack
.
It's also possible to create custom master_tops modules. Simply place them into
salt://_tops
in the Salt fileserver and use the
saltutil.sync_tops
runner to sync
them. If this runner function is not available, they can manually be placed
into extmods/tops
, relative to the master cachedir (in most cases the full
path will be /var/cache/salt/master/extmods/tops
).
Custom tops modules are written like any other execution module, see the source for the two modules above for examples of fully functional ones. Below is a bare-bones example:
/etc/salt/master:
master_tops:
customtop: True
customtop.py: (custom master_tops module)
import logging
import sys
# Define the module's virtual name
__virtualname__ = "customtop"
log = logging.getLogger(__name__)
def __virtual__():
return __virtualname__
def top(**kwargs):
log.debug("Calling top in customtop")
return {"base": ["test"]}
salt minion state.show_top should then display something like:
$ salt minion state.show_top
minion
----------
base:
- test
Note
If a master_tops module returns top file data for a given minion, it will be added to the states configured in the top file. It will not replace it altogether. The 2018.3.0 release adds additional functionality allowing a minion to treat master_tops as the single source of truth, irrespective of the top file.