added environment variables as config overrides for vmware inventory

fixed vmware properties, was getting parent's properties
cache now actually works
removed tags, they were not the ones i was looking for
renamed cache defaults fixed ini file to match
This commit is contained in:
Brian Coca 2014-07-14 20:15:35 -04:00
parent f0aab114ea
commit 900a9f9556
2 changed files with 50 additions and 48 deletions

View file

@ -6,8 +6,8 @@ guests_only = True
#hw_group = #hw_group =
[cache] [cache]
cache_max_age = 3600 max_age = 3600
cache_dir = /var/tmp dir = ~/.cache/ansible
[auth] [auth]
host = vcenter.example.com host = vcenter.example.com

View file

@ -14,6 +14,9 @@ i.e vmware.py/vmware_colo.ini vmware_idf.py/vmware_idf.ini
so if you don't have clustered vcenter but multiple esx machines or so if you don't have clustered vcenter but multiple esx machines or
just diff clusters you can have a inventory per each and automatically just diff clusters you can have a inventory per each and automatically
group hosts based on file name or specify a group in the ini. group hosts based on file name or specify a group in the ini.
You can also use <SCRIPT_NAME>_HOST|USER|PASSWORD environment variables
to override the ini.
''' '''
import os import os
@ -31,33 +34,40 @@ except ImportError:
def save_cache(cache_item, data, config): def save_cache(cache_item, data, config):
''' saves item to cache ''' ''' saves item to cache '''
dpath = config.get('defaults', 'cache_dir')
try: if config.has_option('cache', 'dir'):
cache = open('/'.join([dpath,cache_item]), 'w') dpath = os.path.expanduser(config.get('cache', 'dir'))
cache.write(json.dumps(data)) try:
cache.close() if not os.path.exists(dpath):
except IOError, e: os.makedirs(dpath)
pass # not really sure what to do here if os.path.isdir(dpath):
cache = open('/'.join([dpath,cache_item]), 'w')
cache.write(json.dumps(data))
cache.close()
except IOError, e:
pass # not really sure what to do here
def get_cache(cache_item, config): def get_cache(cache_item, config):
''' returns cached item ''' ''' returns cached item '''
dpath = config.get('defaults', 'cache_dir')
inv = {} inv = {}
try: if config.has_option('cache', 'dir'):
cache = open('/'.join([dpath,cache_item]), 'r') dpath = os.path.expanduser(config.get('cache', 'dir'))
inv = json.loads(cache.read()) try:
cache.close() cache = open('/'.join([dpath,cache_item]), 'r')
except IOError, e: inv = json.loads(cache.read())
pass # not really sure what to do here cache.close()
except IOError, e:
pass # not really sure what to do here
return inv return inv
def cache_available(cache_item, config): def cache_available(cache_item, config):
''' checks if we have a 'fresh' cache available for item requested ''' ''' checks if we have a 'fresh' cache available for item requested '''
if config.has_option('defaults', 'cache_dir'): if config.has_option('cache', 'dir'):
dpath = config.get('defaults', 'cache_dir') dpath = os.path.expanduser(config.get('cache', 'dir'))
try: try:
existing = os.stat( '/'.join([dpath,cache_item])) existing = os.stat( '/'.join([dpath,cache_item]))
@ -65,8 +75,8 @@ def cache_available(cache_item, config):
# cache doesn't exist or isn't accessible # cache doesn't exist or isn't accessible
return False return False
if config.has_option('defaults', 'cache_max_age'): if config.has_option('cache', 'max_age'):
maxage = config.get('defaults', 'cache_max_age') maxage = config.get('cache', 'max_age')
if (existing.st_mtime - int(time.time())) <= maxage: if (existing.st_mtime - int(time.time())) <= maxage:
return True return True
@ -78,9 +88,9 @@ def get_host_info(host):
hostinfo = { hostinfo = {
'vmware_name' : host.name, 'vmware_name' : host.name,
'vmware_tag' : host.tag,
'vmware_parent': host.parent.name, 'vmware_parent': host.parent.name,
} }
for k in host.capability.__dict__.keys(): for k in host.capability.__dict__.keys():
if k.startswith('_'): if k.startswith('_'):
continue continue
@ -95,9 +105,11 @@ def get_host_info(host):
def get_inventory(client, config): def get_inventory(client, config):
''' Reads the inventory from cache or vmware api ''' ''' Reads the inventory from cache or vmware api '''
inv = {}
if cache_available('inventory', config): if cache_available('inventory', config):
inv = get_cache('inventory',config) inv = get_cache('inventory',config)
else: elif client:
inv= { 'all': {'hosts': []}, '_meta': { 'hostvars': {} } } inv= { 'all': {'hosts': []}, '_meta': { 'hostvars': {} } }
default_group = os.path.basename(sys.argv[0]).rstrip('.py') default_group = os.path.basename(sys.argv[0]).rstrip('.py')
@ -125,39 +137,25 @@ def get_inventory(client, config):
if not guests_only: if not guests_only:
inv['all']['hosts'].append(host.name) inv['all']['hosts'].append(host.name)
inv[hw_group].append(host.name) inv[hw_group].append(host.name)
if host.tag:
taggroup = 'vmware_' + host.tag
if taggroup in inv:
inv[taggroup].append(host.name)
else:
inv[taggroup] = [ host.name ]
inv['_meta']['hostvars'][host.name] = get_host_info(host) inv['_meta']['hostvars'][host.name] = get_host_info(host)
save_cache(vm.name, inv['_meta']['hostvars'][host.name], config) save_cache(vm.name, inv['_meta']['hostvars'][host.name], config)
for vm in host.vm: for vm in host.vm:
inv['all']['hosts'].append(vm.name) inv['all']['hosts'].append(vm.name)
inv[vm_group].append(vm.name) inv[vm_group].append(vm.name)
if vm.tag: inv['_meta']['hostvars'][vm.name] = get_host_info(vm)
taggroup = 'vmware_' + vm.tag
if taggroup in inv:
inv[taggroup].append(vm.name)
else:
inv[taggroup] = [ vm.name ]
inv['_meta']['hostvars'][vm.name] = get_host_info(host)
save_cache(vm.name, inv['_meta']['hostvars'][vm.name], config) save_cache(vm.name, inv['_meta']['hostvars'][vm.name], config)
save_cache('inventory', inv, config) save_cache('inventory', inv, config)
return json.dumps(inv) return json.dumps(inv)
def get_single_host(client, config, hostname): def get_single_host(client, config, hostname):
inv = {} inv = {}
if cache_available(hostname, config): if cache_available(hostname, config):
inv = get_cache(hostname,config) inv = get_cache(hostname,config)
else: elif client:
hosts = HostSystem.all(client) #TODO: figure out single host getter hosts = HostSystem.all(client) #TODO: figure out single host getter
for host in hosts: for host in hosts:
if hostname == host.name: if hostname == host.name:
@ -165,13 +163,14 @@ def get_single_host(client, config, hostname):
break break
for vm in host.vm: for vm in host.vm:
if hostname == vm.name: if hostname == vm.name:
inv = get_host_info(host) inv = get_host_info(vm)
break break
save_cache(hostname,inv,config) save_cache(hostname,inv,config)
return json.dumps(inv) return json.dumps(inv)
if __name__ == '__main__': if __name__ == '__main__':
inventory = {} inventory = {}
hostname = None hostname = None
@ -181,25 +180,28 @@ if __name__ == '__main__':
# Read config # Read config
config = ConfigParser.SafeConfigParser() config = ConfigParser.SafeConfigParser()
for configfilename in [os.path.abspath(sys.argv[0]).rstrip('.py') + '.ini', 'vmware.ini']: me = os.path.abspath(sys.argv[0]).rstrip('.py')
for configfilename in [me + '.ini', 'vmware.ini']:
if os.path.exists(configfilename): if os.path.exists(configfilename):
config.read(configfilename) config.read(configfilename)
break break
mename = os.path.basename(me).upper()
host = os.getenv('VMWARE_' + mename + '_HOST',os.getenv('VMWARE_HOST', config.get('auth','host')))
user = os.getenv('VMWARE_' + mename + '_USER', os.getenv('VMWARE_USER', config.get('auth','user')))
password = os.getenv('VMWARE_' + mename + '_PASSWORD',os.getenv('VMWARE_PASSWORD', config.get('auth','password')))
try: try:
client = Client( config.get('auth','host'), client = Client( host,user,password )
config.get('auth','user'),
config.get('auth','password'),
)
except Exception, e: except Exception, e:
client = None client = None
#print >> STDERR "Unable to login (only cache avilable): %s", str(e) #print >> STDERR "Unable to login (only cache avilable): %s", str(e)
# acitually do the work # Actually do the work
if hostname is None: if hostname is None:
inventory = get_inventory(client, config) inventory = get_inventory(client, config)
else: else:
inventory = get_single_host(client, config, hostname) inventory = get_single_host(client, config, hostname)
# return to ansible # Return to ansible
print inventory print inventory