Pārlūkot izejas kodu

fix inventory.py script

master
jdongmo pirms 3 gadiem
vecāks
revīzija
5f6a7db5b1
1 mainītis faili ar 177 papildinājumiem un 177 dzēšanām
  1. +177
    -177
      inventory/inventory.py

+ 177
- 177
inventory/inventory.py Parādīt failu

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

Notiek ielāde…
Atcelt
Saglabāt