from nornir.core.deserializer.inventory import Inventory
import os
import yaml
[docs]class NornirInventory(Inventory):
"""
default inventory module to dynamically create inventory objects from host_vars and group_vars
and load the inventory objects into nornir's inventory system.
"""
def __init__(self, **kwargs):
"""
initialize the NornirInventory class and load the data into nornir
"""
super().__init__(
hosts=self.nhosts(), groups=self.ngroups(), defaults=self.ndefaults()
)
[docs] def nhosts(self):
from netnir.core.credentials import Credentials
from netnir.constants import (
HOSTVARS,
TEMPLATES,
DOMAIN,
)
"""
load devices from host_vars and load them into the nornir inventory schema
"""
data = dict()
hosts = os.listdir(os.path.expanduser(HOSTVARS))
creds = Credentials()
creds = creds.fetch()
for host in hosts:
domain = DOMAIN
host_vars = yaml.load(
open(os.path.expanduser(HOSTVARS) + "/" + host), Loader=yaml.SafeLoader,
)
data[host] = {
"hostname": f"{host}.{domain}" if domain else host,
"username": host_vars.get("username", creds["username"]),
"password": host_vars.get("password", creds["password"]),
"port": host_vars.get("port", 22),
"platform": host_vars["os"],
"groups": host_vars.get("groups", list()),
"data": {
**host_vars,
"name": host,
"template_path": "/".join(
[
os.path.expanduser(TEMPLATES),
host_vars["provider"],
host_vars["os"],
],
),
"mgmt_protocol": host_vars.get("mgmt_protocol", "ssh"),
},
}
return data
[docs] def ngroups(self):
"""
load groups from group_vars and load them into the nornir inventory schema
"""
from netnir.constants import GROUPVARS
data = dict()
groups = os.listdir(os.path.expanduser(GROUPVARS))
if "all" in groups:
groups.remove("all")
for group in groups:
group_vars = yaml.load(
open(os.path.expanduser(GROUPVARS) + "/" + group),
Loader=yaml.SafeLoader,
)
data[group] = {"data": group_vars}
return data
[docs] def ndefaults(self):
"""
load the defaults from group_vars/all and load them into the nornir inventory schema
"""
from netnir.constants import GROUPVARS
if os.path.isfile(os.path.expanduser(GROUPVARS) + "/all"):
default_vars = yaml.load(
open(os.path.expanduser(GROUPVARS) + "/all"), Loader=yaml.SafeLoader,
)
else:
default_vars = dict()
return {"data": default_vars}