From 5f6a7db5b146aba67860f6543fc22621b5dede70 Mon Sep 17 00:00:00 2001 From: jdongmo Date: Wed, 2 Mar 2022 12:06:19 -0500 Subject: [PATCH] fix inventory.py script --- inventory/inventory.py | 354 ++++++++++++++++++++--------------------- 1 file changed, 177 insertions(+), 177 deletions(-) diff --git a/inventory/inventory.py b/inventory/inventory.py index 69f7eab..25aeb63 100755 --- a/inventory/inventory.py +++ b/inventory/inventory.py @@ -1,177 +1,177 @@ -#!/usr/bin/env python3 -import sys -import os -import yaml -import json - - -class YamlReaderError(Exception): - pass - - -#********************************** -def static_to_dynamic_inventory(inputdict, hosts={}, groups={}, position='top'): - '''{ - "_meta": { - "hostvars": {} - }, - "all": { - "children": [ - "ungrouped" - ] - }, - "ungrouped": { - "children": [ - ] - } - } - ''' - - outputdict = {'_meta': {'hostvars': {} }} - newhosts = {} - newgroups = {} - for k,v in inputdict.items(): - if k == 'groups' or k == 'children': - for group in v: - if group not in groups: - groups.update({group: {}}) - if isinstance(v, dict): - if 'children' in v: - if not k in newgroups: - newgroups = { k: { 'children': [] }} - for group in v['children']: - newgroups[k]['children'].append(group) - groups.update(newgroups) - if 'groups' in v: - if not k in newgroups: - newgroups = { k: { 'children': [] }} - for group in v['groups']: - newgroups[k]['children'].append(group) - groups.update(newgroups) - if 'hosts' in v: - if isinstance(v['hosts'], list): - msg = """ - Hosts should not be define as a list: - Error appear on v['hosts'] - Do this: - hosts: - host1: - host2: - Instead of this: - hosts: - - host1 - - host2 - Exit on Error (1) - """ - sys.stderr.write(msg) - exit(1) - for host in list(v['hosts']): - if k in groups: - if 'hosts' in groups[k]: - groups[k]['hosts'].append(host) - else: - groups[k]['hosts'] = [host] - else: - groups.update({k: {'hosts': [host]}}) - if v['hosts'][host] is None: - if not host in newhosts: - newhosts[host] = {} - elif 'vars' in v['hosts'][host]: - newhosts.update({host: v['hosts'][host]}) - else: - for key,val in v['hosts'][host].items(): - if host in newhosts: - newhosts[host].update({key: val}) - else: - newhosts[host] = {key: val} - hosts.update(newhosts) - if 'vars' in v: - if position == 'group': - if k in newgroups: - newgroups[k].update({'vars': v['vars']}) - else: - newgroups[k] = {'vars': v['vars']} - groups.update(newgroups) - if k == 'groups' or k == 'children': - newposition = 'group' - elif k == 'hosts': - newposition = 'host' - else: - newposition = 'data' - valid_group_syntax = ['children', 'groups', 'hosts', 'vars', '', None] - if position == 'group': - for word in v: - if not word in valid_group_syntax: - print("Syntax error in definition of group: {}".format(k)) - print("\"{}\" is not a valid syntax key in group".format(word)) - exit(1) - outputdict.update(static_to_dynamic_inventory(v, hosts, groups, newposition)) - outputdict['_meta']['hostvars'].update(hosts) - outputdict.update(groups) - return outputdict - -#********************************** -def data_merge(inst1, inst2): - - try: - if (inst1 is None or isinstance(inst1, str) - or isinstance(inst1, int) - or isinstance(inst1, float) - ): - inst1 = inst2 - elif isinstance(inst1, list): - if isinstance(inst2, list): - inst1 = inst1 + inst2 - else: - inst1.append(inst2) - elif isinstance(inst1, dict): - if isinstance(inst2, dict): - inst1.update(inst2) - else: - raise YamlReaderError('Cannot merge non-dict "%s" into dict "%s"' % (inst2, inst1)) - except TypeError as e: - raise YamlReaderError('TypeError "%s" when merging "%s" into "%s"' % - (e, inst1, inst2)) - return inst1 - -#********************************** -def load_static_inventory(path, static): - - ##- load static - #add filename to dir - files = {} - files['static'] = {} - files['static']['dir'] = path + '/static' - files['static']['files'] = [] - - static_hosts = [] - #get all *.yml files - for root, directory, filename in sorted(os.walk(path)): - for file in filename: - if file.endswith(('.yml', '.yaml')): - files['static']['files'].append(os.path.join(root, file)) - filecontent = None - filecontent = yaml.load( - open(os.path.join(root, file), "rb").read(), - Loader=yaml.FullLoader - ) - if type(filecontent) == dict: - filecontent = static_to_dynamic_inventory(filecontent) - if 'hostvars' in filecontent['_meta']: - for hostname in filecontent['_meta']['hostvars']: - static_hosts.append(hostname) - static.update(filecontent) - static_hosts = sorted(set(static_hosts)) - return static, static_hosts - -#********************************** -def main(): - static = {'_meta': {'hostvars': {}}} - - static, static_hosts = load_static_inventory(os.path.dirname(__file__), static) - print(format(json.dumps(static, indent=2))) - #print(format(json.dumps(static_hosts, indent=2))) - -if __name__ == '__main__': - main() - +#!/usr/bin/env python3 +import sys +import os +import yaml +import json + + +class YamlReaderError(Exception): + pass + + +#********************************** +def static_to_dynamic_inventory(inputdict, hosts={}, groups={}, position='top'): + '''{ + "_meta": { + "hostvars": {} + }, + "all": { + "children": [ + "ungrouped" + ] + }, + "ungrouped": { + "children": [ + ] + } + } + ''' + + outputdict = {'_meta': {'hostvars': {} }} + newhosts = {} + newgroups = {} + for k,v in inputdict.items(): + if k == 'groups' or k == 'children': + for group in v: + if group not in groups: + groups.update({group: {}}) + if isinstance(v, dict): + if 'children' in v: + if not k in newgroups: + newgroups = { k: { 'children': [] }} + for group in v['children']: + newgroups[k]['children'].append(group) + groups.update(newgroups) + if 'groups' in v: + if not k in newgroups: + newgroups = { k: { 'children': [] }} + for group in v['groups']: + newgroups[k]['children'].append(group) + groups.update(newgroups) + if 'hosts' in v: + if isinstance(v['hosts'], list): + msg = """ + Hosts should not be define as a list: + Error appear on v['hosts'] + Do this: + hosts: + host1: + host2: + Instead of this: + hosts: + - host1 + - host2 + Exit on Error (1) + """ + sys.stderr.write(msg) + exit(1) + for host in list(v['hosts']): + if k in groups: + if 'hosts' in groups[k]: + groups[k]['hosts'].append(host) + else: + groups[k]['hosts'] = [host] + else: + groups.update({k: {'hosts': [host]}}) + if v['hosts'][host] is None: + if not host in newhosts: + newhosts[host] = {} + elif 'vars' in v['hosts'][host]: + newhosts.update({host: v['hosts'][host]}) + else: + for key,val in v['hosts'][host].items(): + if host in newhosts: + newhosts[host].update({key: val}) + else: + newhosts[host] = {key: val} + hosts.update(newhosts) + if 'vars' in v: + if position == 'group': + if k in newgroups: + newgroups[k].update({'vars': v['vars']}) + else: + newgroups[k] = {'vars': v['vars']} + groups.update(newgroups) + if k == 'groups' or k == 'children': + newposition = 'group' + elif k == 'hosts': + newposition = 'host' + else: + newposition = 'data' + valid_group_syntax = ['children', 'groups', 'hosts', 'vars', '', None] + if position == 'group': + for word in v: + if not word in valid_group_syntax: + print("Syntax error in definition of group: {}".format(k)) + print("\"{}\" is not a valid syntax key in group".format(word)) + exit(1) + outputdict.update(static_to_dynamic_inventory(v, hosts, groups, newposition)) + outputdict['_meta']['hostvars'].update(hosts) + outputdict.update(groups) + return outputdict + +#********************************** +def data_merge(inst1, inst2): + + try: + if (inst1 is None or isinstance(inst1, str) + or isinstance(inst1, int) + or isinstance(inst1, float) + ): + inst1 = inst2 + elif isinstance(inst1, list): + if isinstance(inst2, list): + inst1 = inst1 + inst2 + else: + inst1.append(inst2) + elif isinstance(inst1, dict): + if isinstance(inst2, dict): + inst1.update(inst2) + else: + raise YamlReaderError('Cannot merge non-dict "%s" into dict "%s"' % (inst2, inst1)) + except TypeError as e: + raise YamlReaderError('TypeError "%s" when merging "%s" into "%s"' % + (e, inst1, inst2)) + return inst1 + +#********************************** +def load_static_inventory(path, static): + + ##- load static + #add filename to dir + files = {} + files['static'] = {} + files['static']['dir'] = path + '/static' + files['static']['files'] = [] + + static_hosts = [] + #get all *.yml files + for root, directory, filename in sorted(os.walk(path)): + for file in filename: + if file.endswith(('.yml', '.yaml')): + files['static']['files'].append(os.path.join(root, file)) + filecontent = None + filecontent = yaml.load( + open(os.path.join(root, file), "rb").read(), + Loader=yaml.FullLoader + ) + if type(filecontent) == dict: + filecontent = static_to_dynamic_inventory(filecontent) + if 'hostvars' in filecontent['_meta']: + for hostname in filecontent['_meta']['hostvars']: + static_hosts.append(hostname) + static.update(filecontent) + static_hosts = sorted(set(static_hosts)) + return static, static_hosts + +#********************************** +def main(): + static = {'_meta': {'hostvars': {}}} + + static, static_hosts = load_static_inventory(os.path.dirname(__file__), static) + print(format(json.dumps(static, indent=2))) + #print(format(json.dumps(static_hosts, indent=2))) + +if __name__ == '__main__': + main() +