64 lines
2.2 KiB
Python
64 lines
2.2 KiB
Python
|
import re
|
||
|
import yaml
|
||
|
from types import SimpleNamespace
|
||
|
from yamlpath.common import Parsers
|
||
|
from yamlpath.wrappers import ConsolePrinter
|
||
|
from yamlpath import Processor
|
||
|
from yamlpath import YAMLPath
|
||
|
from yamlpath.exceptions import YAMLPathException
|
||
|
|
||
|
def TrackIPEntries(yaml_file,searchstring='all.children.**.ip'):
|
||
|
### Try to parse an Ansible inventory for hosts with the 'ip' attribute.
|
||
|
# param file: the file to parse
|
||
|
# return: a populated entry set in form [{Host,[ip,mac]},...]
|
||
|
|
||
|
# Borrowing from upstream author's example at https://pypi.org/project/yamlpath/
|
||
|
|
||
|
entryset = {}
|
||
|
|
||
|
# The various classes of this library must be able to write messages somewhere
|
||
|
# when things go bad.
|
||
|
#logging_args = SimpleNamespace(quiet=True, verbose=False, debug=False)
|
||
|
logging_args = SimpleNamespace(quiet=True, verbose=True, debug=True)
|
||
|
log = ConsolePrinter(logging_args)
|
||
|
|
||
|
# Prep the YAML parser
|
||
|
yaml = Parsers.get_yaml_editor()
|
||
|
(yaml_data, doc_loaded) = Parsers.get_yaml_data(yaml, log, yaml_file)
|
||
|
if not doc_loaded:
|
||
|
exit(1)
|
||
|
processor = Processor(log, yaml_data)
|
||
|
|
||
|
yaml_path = YAMLPath(searchstring)
|
||
|
|
||
|
# Create a regex pattern to remove the end of the path
|
||
|
ippattern = re.compile('\.ip$')
|
||
|
try:
|
||
|
for node_coordinate in processor.get_nodes(yaml_path, mustexist=True):
|
||
|
# Strip the path to the host entry.
|
||
|
path = ippattern.sub("",str(node_coordinate.path))
|
||
|
# Pull the IP
|
||
|
ip = str(node_coordinate.node)
|
||
|
# Pull the hosname
|
||
|
splitpath = path.split('.')
|
||
|
hostname = splitpath[len(splitpath)-1]
|
||
|
#print("Got {} from '{}''.".format(ip,path))
|
||
|
|
||
|
# Path the MAC
|
||
|
mac_yaml_path = YAMLPath(path+".mac")
|
||
|
mac=""
|
||
|
try:
|
||
|
for node_coordinate in processor.get_nodes(mac_yaml_path, mustexist=True):
|
||
|
mac = str(node_coordinate.node)
|
||
|
except YAMLPathException as ex:
|
||
|
log.error(ex)
|
||
|
|
||
|
# Add the host to the entryset.
|
||
|
entryset.update({ hostname : [ip,mac] })
|
||
|
|
||
|
except YAMLPathException as ex:
|
||
|
log.error(ex)
|
||
|
|
||
|
finally:
|
||
|
return entryset
|