2024-04-01 00:44:23 -05:00
|
|
|
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
|
2025-04-12 02:58:38 -05:00
|
|
|
# return: a populated entry set in form [{Host,[ip,mac,fqdn]},...]
|
2024-04-01 00:44:23 -05:00
|
|
|
|
|
|
|
# Borrowing from upstream author's example at https://pypi.org/project/yamlpath/
|
|
|
|
|
|
|
|
entryset = {}
|
2025-04-12 02:58:38 -05:00
|
|
|
replicadomain = GetReplicaDomain(yaml_file)
|
2024-04-01 00:44:23 -05:00
|
|
|
|
|
|
|
# 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
|
2025-04-12 02:58:38 -05:00
|
|
|
ippattern = re.compile('\\.ip$')
|
2024-04-01 00:44:23 -05:00
|
|
|
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.
|
2025-04-12 02:58:38 -05:00
|
|
|
entryset.update({ hostname : [ip,mac,hostname+'.'+replicadomain] })
|
2024-04-01 00:44:23 -05:00
|
|
|
|
|
|
|
except YAMLPathException as ex:
|
|
|
|
log.error(ex)
|
|
|
|
|
|
|
|
finally:
|
|
|
|
return entryset
|
2025-04-12 02:58:38 -05:00
|
|
|
|
|
|
|
def GetReplicaDomain(file):
|
|
|
|
'''
|
|
|
|
Return the defined replica domain
|
|
|
|
'''
|
|
|
|
with open(file, 'r') as stream:
|
|
|
|
content = yaml.safe_load(stream)
|
|
|
|
return content['all']['vars']['replica_domain']
|