Writing a custom inventory plugin

If you have your own backend with host information or you don’t like the provided ones you can write your own custom inventory. Doing so is quite easy. A continuation you can find a very simple one with static data.

[1]:
%cat writing_a_custom_inventory_plugin/my_inventory.py
from nornir.core.deserializer.inventory import Inventory


class MyInventory(Inventory):
    def __init__(self, **kwargs):
        # code to get the data
        hosts = {
            "host1": {
                "data": {"data1": "value1", "data2": "value2", "data3": "value3"},
                "groups": ["my_group1"],
            },
            "host2": {
                "data": {"data1": "value1", "data2": "value2", "data3": "value3"},
                "groups": ["my_group1"],
            },
        }
        groups = {
            "my_group1": {
                "data": {
                    "more_data1": "more_value1",
                    "more_data2": "more_value2",
                    "more_data3": "more_value3",
                }
            }
        }
        defaults = {"data": {"location": "internet", "language": "Python"}}

        # passing the data to the parent class so the data is
        # transformed into actual Host/Group objects
        # and set default data for all hosts
        super().__init__(hosts=hosts, groups=groups, defaults=defaults, **kwargs)

A dynamic inventory basically would have to retrieve the data, rearrange in a similar way as in the example above and call super. Now, let’s see how to use it:

[2]:
from nornir import InitNornir
from nornir.core.deserializer.inventory import Inventory
import pprint

nr = InitNornir(
    inventory={
        "plugin": "writing_a_custom_inventory_plugin.my_inventory.MyInventory"
    }
)
pprint.pprint(Inventory.serialize(nr.inventory).dict())
{'defaults': {'connection_options': {},
              'data': {'language': 'Python', 'location': 'internet'},
              'hostname': None,
              'password': None,
              'platform': None,
              'port': None,
              'username': None},
 'groups': {'my_group1': {'connection_options': {},
                          'data': {'more_data1': 'more_value1',
                                   'more_data2': 'more_value2',
                                   'more_data3': 'more_value3'},
                          'groups': [],
                          'hostname': None,
                          'password': None,
                          'platform': None,
                          'port': None,
                          'username': None}},
 'hosts': {'host1': {'connection_options': {},
                     'data': {'data1': 'value1',
                              'data2': 'value2',
                              'data3': 'value3'},
                     'groups': ['my_group1'],
                     'hostname': None,
                     'password': None,
                     'platform': None,
                     'port': None,
                     'username': None},
           'host2': {'connection_options': {},
                     'data': {'data1': 'value1',
                              'data2': 'value2',
                              'data3': 'value3'},
                     'groups': ['my_group1'],
                     'hostname': None,
                     'password': None,
                     'platform': None,
                     'port': None,
                     'username': None}}}