zone_id = '' if args.zone: zones = cs.listZones() if zones: for z in zones['zone']: if z['name'] == args.zone: zone_id = z['id'] break if not zone_id: print "zone %s not found" % args.zone sys.exit(1) vms = {} vms = cs.listRouters(projectid=project_id) if vms: for vm in vms['router']: pod_ip = None for n in vm['nic']: if n['traffictype'] == 'Control': if vm['zoneid'] == zone_id: pod_ip = n['ipaddress'] arglist = ' -C "ping 8.8.8.8 -c 1" > /dev/null ' cmd = 'ssh root@' + str(pod_ip) + arglist retvalue = os.system(cmd) if not retvalue: print "OK - no packetloss on router: %s" % ( vm['name']) exit(0)
class CloudStackInventory(object): def __init__(self): parser = argparse.ArgumentParser() parser.add_argument('--host') parser.add_argument('--list', action='store_true') parser.add_argument('--project') options = parser.parse_args() try: self.cs = CloudStack(**read_config()) except CloudStackException: print >> sys.stderr, "Error: Could not connect to CloudStack API" sys.exit(1) project_id = -1 if options.project: project_id = self.get_project_id(options.project) if options.host: data = self.get_host(options.host, project_id) print json.dumps(data, indent=2) elif options.list: data = self.get_list(project_id) print json.dumps(data, indent=2) else: print >> sys.stderr, "usage: --list | --host <hostname> [--project <project>]" sys.exit(1) def get_project_id(self, project): projects = self.cs.listProjects(listall=True) if projects: for p in projects['project']: if p['name'] == project or p['id'] == project: return p['id'] print >> sys.stderr, "Error: Project %s not found." % project sys.exit(1) def add_group(self, data, group_name, router_name): if group_name not in data: data[group_name] = {'hosts': []} data[group_name]['hosts'].append(router_name) return data def get_host(self, name, project_id): routers = [] routers_projects = self.cs.listRouters(projectid=project_id, listall=True) if routers_projects and 'router' in routers_projects: routers = routers + routers_projects['router'] routers_accounts = self.cs.listRouters(listall=True) if routers_accounts and 'router' in routers_accounts: routers = routers + routers_accounts['router'] data = {} for router in routers: router_name = router['name'] if name == router_name: data['zone'] = router['zonename'] if 'linklocalip' in router: data['ansible_ssh_host'] = router['linklocalip'] data['state'] = router['state'] data['redundant_state'] = router['redundantstate'] if 'account' in router: data['account'] = router['account'] if 'project' in router: data['project'] = router['project'] data['service_offering'] = router['serviceofferingname'] data['role'] = router['role'] data['nic'] = [] for nic in router['nic']: data['nic'].append({ 'ip': nic['ipaddress'], 'mac': nic['macaddress'], 'netmask': nic['netmask'], }) if nic['isdefault']: data['default_ip'] = nic['ipaddress'] break systemvms = self.cs.listSystemVms() for systemvm in systemvms.get('systemvm') or []: systemvm_name = systemvm['name'] if name == systemvm_name: data['zone'] = systemvm['zonename'] if 'privateip' in systemvm: data['ansible_ssh_host'] = systemvm['privateip'] data['state'] = systemvm['state'] break return data def get_list(self, project_id): data = { 'all': { 'hosts': [], }, '_meta': { 'hostvars': {}, }, } routers = [] routers_projects = self.cs.listRouters(projectid=project_id, listall=True) if routers_projects and 'router' in routers_projects: routers = routers + routers_projects['router'] routers_accounts = self.cs.listRouters(listall=True) if routers_accounts and 'router' in routers_accounts: routers = routers + routers_accounts['router'] for router in routers: if router['state'] != 'Running': continue router_name = router['name'] data['all']['hosts'].append(router_name) # Make a group per domain data = self.add_group(data, router['domain'], router_name) data['_meta']['hostvars'][router_name] = {} data['_meta']['hostvars'][router_name]['group'] = router['domain'] data['_meta']['hostvars'][router_name]['domain'] = router['domain'] if 'networkdomain' in router: data['_meta']['hostvars'][router_name][ 'networkdomain'] = router['networkdomain'] data['_meta']['hostvars'][router_name]['zone'] = router['zonename'] # Make a group per zone data = self.add_group(data, router['zonename'], router_name) if 'project' in router: data['_meta']['hostvars'][router_name]['project'] = router[ 'project'] # Make a group per project data = self.add_group(data, router['project'], router_name) if 'account' in router: data['_meta']['hostvars'][router_name]['account'] = router[ 'account'] # Make a group per account data = self.add_group(data, router['account'], router_name) data['_meta']['hostvars'][router_name][ 'ansible_ssh_host'] = router['linklocalip'] data['_meta']['hostvars'][router_name]['state'] = router['state'] if 'redundantstate' in router: data['_meta']['hostvars'][router_name][ 'redundant_state'] = router['redundantstate'] if router['redundantstate'] in ['MASTER', 'BACKUP']: data = self.add_group(data, 'redundant_routers', router_name) if router['redundantstate'] in ['MASTER']: data = self.add_group(data, 'redundant_master_routers', router_name) if router['redundantstate'] in ['BACKUP']: data = self.add_group(data, 'redundant_backup_routers', router_name) if router['redundantstate'] in ['UNKNOWN']: data = self.add_group(data, 'non_redundant_routers', router_name) data['_meta']['hostvars'][router_name][ 'service_offering'] = router['serviceofferingname'] data['_meta']['hostvars'][router_name]['nic'] = [] for nic in router['nic']: data['_meta']['hostvars'][router_name]['nic'].append({ 'ip': nic['ipaddress'], 'mac': nic['macaddress'], 'netmask': nic['netmask'], }) if nic['isdefault']: data['_meta']['hostvars'][router_name]['default_ip'] = nic[ 'ipaddress'] systemvms = self.cs.listSystemVms() for systemvm in systemvms.get('systemvm') or []: if systemvm['state'] != 'Running': continue if 'privateip' not in systemvm: continue systemvm_name = systemvm['name'] data['all']['hosts'].append(systemvm_name) # Make a group per domain data = self.add_group(data, 'ROOT', systemvm_name) data['_meta']['hostvars'][systemvm_name] = dict( group='ROOT', domain='ROOT', account='system', zone=systemvm['zonename']) # Make a group per zone data = self.add_group(data, systemvm['zonename'], systemvm_name) data['_meta']['hostvars'][systemvm_name][ 'ansible_ssh_host'] = systemvm['privateip'] data['_meta']['hostvars'][systemvm_name]['state'] = systemvm[ 'state'] return data
zone_id = '' if args.zone: zones = cs.listZones() if zones: for z in zones['zone']: if z['name'] == args.zone: zone_id = z['id'] break if not zone_id: print "zone %s not found" % args.zone sys.exit(1) vms = {} vms = cs.listRouters(projectid=project_id) if vms: for vm in vms['router']: pod_ip = None for n in vm['nic']: if n['traffictype'] == 'Control': if vm['zoneid'] == zone_id: pod_ip = n['ipaddress'] arglist = ' -C "ping 8.8.8.8 -c 1" > /dev/null ' cmd = 'ssh root@' + str(pod_ip) + arglist retvalue = os.system(cmd) if not retvalue: print "OK - no packetloss on router: %s" % ( vm['name'] ) exit(0) else:
class csresources: def __init__(self): tempdict = {} path = os.path.dirname(os.path.abspath(__file__)) # Read config try: f = open(path + "/../cloudstack.config", "r") config = f.readlines() except: print("Somethings wrong with your config file") sys.exit(2) for entry in config: entry = entry.replace("\n", "") temarray = entry.split("=") tempdict[temarray[0]] = temarray[1] if tempdict['verify'] is None: tempdict['verify'] = False self.cs = CloudStack(endpoint=tempdict['endpoint'], key=tempdict['key'], secret=tempdict['secret'], verify=False) def list_virtual_routers(self): routerList = [] domains = self.cs.listDomains() for domain in domains['domain']: projects = self.cs.listProjects(domainid=domain["id"]) if "project" in projects: for project in projects["project"]: routers = self.cs.listRouters(projectid=project["id"]) if "router" in routers: for router in routers["router"]: routerList.append(router) routers = self.cs.listRouters(domainid=domain["id"]) if "router" in routers: for router in routers["router"]: routerList.append(router) return routerList def list_system_vms(self): return self.cs.listSystemVms()['systemvm'] def list_capacity(self): return self.cs.listCapacity()['capacity'] def list_projects(self, domainfilter=None, projectfilter=None): projects = [] domains = self.cs.listDomains(id=domainfilter)['domain'] if projectfilter is not None and domainfilter is not None: temp = self.cs.listProjects(domainid=domainfilter, id=projectfilter) if 'project' in temp: projects += temp['project'] else: for domain in domains: temp = self.cs.listProjects(domainid=domain['id']) if 'project' in temp: for project in temp['project']: projects.append(project) return projects def list_domains(self, domainfilter=None): return self.cs.listDomains(id=domainfilter)['domain'] def list_clusters(self): return self.cs.listClusters()['cluster'] def list_offerings(self): return self.cs.listServiceOfferings()['serviceoffering'] def list_hvs(self): return self.cs.listHosts(type="Routing")['host'] def get_hvstructure(self, cluster, withvm=1): hvstatus = [] domains = self.cs.listDomains() vmdict = [] if 'cluster.memory.allocated.capacity.disablethreshold' in cluster[ 'resourcedetails']: memthreshold = cluster['resourcedetails'][ 'cluster.memory.allocated.capacity.disablethreshold'] else: memthreshold = 1 if 'cluster.cpu.allocated.capacity.disablethreshold' in cluster[ 'resourcedetails']: cputhreshold = cluster['resourcedetails'][ 'cluster.cpu.allocated.capacity.disablethreshold'] else: cputhreshold = 1 memovercommit = cluster['resourcedetails']['memoryOvercommitRatio'] cpuovercommit = cluster['resourcedetails']['cpuOvercommitRatio'] clusterid = cluster['id'] hosts = self.cs.listHosts(clusterid=clusterid) #Get Host list for host in hosts['host']: if host['type'] == "Routing": hvstatus.append({ 'name': host['name'], 'cpu': (float(host['cpunumber'] * host['cpuspeed']) * float(cpuovercommit)) * float(cputhreshold), 'mem': ((host['memorytotal'] * float(memovercommit)) * float(memthreshold)) / 1024, 'memfree': ((host['memorytotal'] * float(memthreshold)) - host['memoryused']) / 1024, 'cpufree': ((float(host['cpunumber'] * host['cpuspeed']) * float(cpuovercommit)) * float(cputhreshold)) - (float(host['cpuallocated'].replace("%", "")) * ((host['cpunumber'] * host['cpuspeed']) / 100)), 'ratio': None, 'vms': [], }) ##Split this as an extra function!!!!!! if withvm == 1: # Get VM list for domain in domains['domain']: projects = self.cs.listProjects(domainid=domain['id']) if "project" in projects.keys(): for project in projects['project']: vms = self.cs.listVirtualMachines( projectid=project['id']) if "virtualmachine" in vms: for vm in vms['virtualmachine']: vmdict.append(vm) #Add VMs to their Hypervisors for vm in vmdict: for hv in hvstatus: if "hostname" in vm: if vm['hostname'] == hv['name']: hv['vms'].append({ 'name': vm['name'], 'cpu': vm['cpunumber'] * vm['cpuspeed'], 'mem': vm['memory'] * 1024, 'instance': vm['instancename'], }) return hvstatus
class CloudStackInventory(object): def __init__(self): parser = argparse.ArgumentParser() parser.add_argument('--host') parser.add_argument('--list', action='store_true') options = parser.parse_args() try: self.cs = CloudStack(**read_config()) except CloudStackException as e: print("Error: Could not connect to CloudStack API", file=sys.stderr) if options.host: data = self.get_host(options.host) print(json.dumps(data, indent=2)) elif options.list: data = self.get_list() print(json.dumps(data, indent=2)) else: print("usage: --list | --host <hostname>", file=sys.stderr) sys.exit(1) def add_group(self, data, group_name, router_name): if group_name not in data: data[group_name] = { 'hosts': [] } data[group_name]['hosts'].append(router_name) return data def get_host(self, name): routers = [] routers_projects = self.cs.listRouters(projectid=-1, listall=True) if routers_projects and 'router' in routers_projects: routers = routers + routers_projects['router'] routers_accounts = self.cs.listRouters(listall=True) if routers_accounts and 'router' in routers_accounts: routers = routers + routers_accounts['router'] data = {} for router in routers: router_name = router['name'] if name == router_name: data['zone'] = router['zonename'] if 'linklocalip' in router: data['ansible_ssh_host'] = router['linklocalip'] data['state'] = router['state'] data['redundant_state'] = router['redundantstate'] if 'account' in router: data['account'] = router['account'] if 'project' in router: data['project'] = router['project'] data['service_offering'] = router['serviceofferingname'] data['role'] = router['role'] data['nic'] = [] for nic in router['nic']: data['nic'].append({ 'ip': nic['ipaddress'], 'mac': nic['macaddress'], 'netmask': nic['netmask'], }) if nic['isdefault']: data['default_ip'] = nic['ipaddress'] break; return data def get_list(self): data = { 'all': { 'hosts': [], }, '_meta': { 'hostvars': {}, }, } routers = [] routers_projects = self.cs.listRouters(projectid=-1, listall=True) if routers_projects and 'router' in routers_projects: routers = routers + routers_projects['router'] routers_accounts = self.cs.listRouters(listall=True) if routers_accounts and 'router' in routers_accounts: routers = routers + routers_accounts['router'] for router in routers: if router['state'] != 'Running': continue router_name = router['name'] data['all']['hosts'].append(router_name) # Make a group per domain data = self.add_group(data, router['domain'], router_name) data['_meta']['hostvars'][router_name] = {} data['_meta']['hostvars'][router_name]['group'] = router['domain'] data['_meta']['hostvars'][router_name]['domain'] = router['domain'] if 'networkdomain' in router: data['_meta']['hostvars'][router_name]['networkdomain'] = router['networkdomain'] data['_meta']['hostvars'][router_name]['zone'] = router['zonename'] # Make a group per zone data = self.add_group(data, router['zonename'], router_name) if 'project' in router: data['_meta']['hostvars'][router_name]['project'] = router['project'] # Make a group per project data = self.add_group(data, router['project'], router_name) if 'account' in router: data['_meta']['hostvars'][router_name]['account'] = router['account'] # Make a group per account data = self.add_group(data, router['account'], router_name) data['_meta']['hostvars'][router_name]['ansible_ssh_host'] = router['linklocalip'] data['_meta']['hostvars'][router_name]['state'] = router['state'] if 'redundantstate' in router: data['_meta']['hostvars'][router_name]['redundant_state'] = router['redundantstate'] if router['redundantstate'] in [ 'MASTER', 'BACKUP' ]: data = self.add_group(data, 'redundant_routers', router_name) if router['redundantstate'] in [ 'MASTER' ]: data = self.add_group(data, 'redundant_master_routers', router_name) if router['redundantstate'] in [ 'BACKUP' ]: data = self.add_group(data, 'redundant_backup_routers', router_name) if router['redundantstate'] in [ 'UNKNOWN' ]: data = self.add_group(data, 'non_redundant_routers', router_name) data['_meta']['hostvars'][router_name]['service_offering'] = router['serviceofferingname'] data['_meta']['hostvars'][router_name]['nic'] = [] for nic in router['nic']: data['_meta']['hostvars'][router_name]['nic'].append({ 'ip': nic['ipaddress'], 'mac': nic['macaddress'], 'netmask': nic['netmask'], }) if nic['isdefault']: data['_meta']['hostvars'][router_name]['default_ip'] = nic['ipaddress'] return data