Source code for _roster.netbox

# -*- coding: utf-8 -*-
'''
Load devices from `NetBox <https://github.com/digitalocean/netbox>`__, and make
them available for salt-ssh or salt-sproxy (or any other program that doesn't
require (Proxy) Minions running).

Make sure that the following options are configured on the Master:

.. code-block:: yaml

    netbox:
      url: <NETBOX_URL>
      token: <NETBOX_USERNAME_API_TOKEN (OPTIONAL)>
      keyfile: </PATH/TO/NETBOX/KEY (OPTIONAL)>

If you want to pre-filter the devices, so it won't try to pull the whole
database available in NetBox, you can configure another key, ``filters``, under
``netbox``, e.g.,

.. code-block:: yaml

    netbox:
      url: <NETBOX_URL>
      filters:
        site: <SITE>
        status: <STATUS>

.. hint::

    You can use any NetBox field as a filter.
'''
# Import Python libs
from __future__ import absolute_import, print_function, unicode_literals
import re
import fnmatch

try:
    import pynetbox  # pylint: disable=unused-import

    HAS_PYNETBOX = True
except ImportError:
    HAS_PYNETBOX = False

__virtualname__ = 'netbox'


def __virtual__():
    if not HAS_PYNETBOX:
        return (False, 'Please install pynetbox to be able to use the NetBox Roster')
    return __virtualname__


[docs]def targets(tgt, tgt_type='glob', **kwargs): ''' Return the targets from NetBox. ''' netbox_filters = __opts__.get('netbox', {}).get('filters', {}) netbox_filters.update(**kwargs) netbox_devices = __runner__['salt.cmd']( 'netbox.filter', 'dcim', 'devices', **netbox_filters ) if tgt_type == 'glob': devices = [ device['name'] for device in netbox_devices if fnmatch.fnmatch(str(device['name']), tgt) ] elif tgt_type == 'list': devices = [device['name'] for device in netbox_devices if device['name'] in tgt] elif tgt_type == 'pcre': rgx = re.compile(tgt) devices = [ device['name'] for device in netbox_devices if rgx.search(device['name']) ] elif tgt_type in ['grain', 'grain_pcre']: grains = __runner__['cache.grains'](tgt, tgt_type=tgt_type) devices = list(grains.keys()) elif tgt_type in ['pillar', 'pillar_pcre']: pillars = __runner__['cache.pillar'](tgt, tgt_type=tgt_type) devices = list(pillars.keys()) # elif tgt_type == 'compound': # TODO: Implement the compound matcher, might need quite a bit of work, # need to evaluate if it's worth pulling all this code from # https://github.com/saltstack/salt/blob/develop/salt/matchers/compound_match.py # or find a smarter way to achieve that. return {device: {} for device in devices}