| @@ -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() | |||