Merge pull request #8189 from bcoca/vmware_inv_env

vmware inventory fixes and features
This commit is contained in:
James Cammarata 2014-07-31 11:16:52 -05:00
commit 74068bc50f
2 changed files with 54 additions and 54 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,44 +34,51 @@ 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]))
except: except:
# 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')
fileage = int( time.time() - existing.st_mtime )
if (existing.st_mtime - int(time.time())) <= maxage: if (maxage > fileage):
return True return True
return False return False
@ -77,10 +87,8 @@ def get_host_info(host):
''' Get variables about a specific host ''' ''' Get variables about a specific host '''
hostinfo = { hostinfo = {
'vmware_name' : host.name, 'vmware_name' : host.name,
'vmware_tag' : host.tag, }
'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 +103,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 +135,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 +161,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 +178,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