def get_ali_ecs_info(): Page_Number = get_page_numbers() start_step = 1 end_step = Page_Number + 1 for number in range(start_step, end_step): client = AcsClient(accessKeyId, accessSecret, regionId) request = DescribeInstancesRequest() request.set_accept_format('json') PageSize = Page_Size request.set_PageNumber(number) request.set_PageSize(PageSize) response = client.do_action_with_exception(request) res = json.loads(str(response, encoding='utf-8')) # print(res["Instances"]["Instance"][0].keys()) instance_id = res["Instances"]["Instance"][0]["InstanceId"] # print(instance_id) disks_info = get_instance_disk_info(instance_id) for instance in res["Instances"]["Instance"]: instance['disk_infos'] = disks_info data.append(instance) # print(len(data)) # instance_number = len(data) # return instance_number return data
def get_all_vm_list(self): request = DescribeInstancesRequest() request.set_PageSize(100) request.set_PageNumber(1) try: response = self.client.do_action_with_exception(request) print(str(response, encoding='utf-8')) response = json.loads(self.client.do_action_with_exception(request), encoding='utf-8') # print(response) print(response['PageNumber']) print(response['TotalCount']) print(response['PageSize']) page_num=int(response['PageNumber']) total_count=int(response['TotalCount']) page_size=int(response['PageSize']) if total_count <= page_size: self.get_vm_list(response['Instances']['Instance']) else: import math for page in range(1,math.floor(total_count/page_size)+1): request.set_PageSize(page_size) request.set_PageNumber(page+1) response = self.client.do_action_with_exception(request) print(str(response, encoding='utf-8')) response = json.loads(self.client.do_action_with_exception(request), encoding='utf-8') self.get_vm_list(response['Instances']['Instance']) return response except ServerException as e: print(e) except ClientException as e: print(e)
def describe_instances(self, instance_ids=None): """ 描述实例 :param instance_ids: 实例ID列表 :return: 实例信息列表 """ instances = [] page_size = 10 page_number = 1 total_count = None request = DescribeInstancesRequest() request.set_InstanceIds(json.dumps(instance_ids or self.instance_ids)) request.set_PageNumber(page_number) request.set_PageSize(page_size) while total_count is None or page_number * page_size < total_count: body = self.client.do_action_with_exception(request) data = json.loads(body) instances.extend(data['Instances']['Instance']) total_count = data['TotalCount'] page_number += 1 request.set_PageNumber(page_number) return instances
def _get_instance_info(self, region): c = client.AcsClient(self._AK, self._AKS, region) req = DescribeInstancesRequest() req.set_PageSize(100) req.set_accept_format('json') page_number = 0 try: response = c.do_action(req) instances = json.loads(response) total = instances['TotalCount'] page_size = instances['PageSize'] if total / page_size > total // page_size: page_number = total // page_size + 1 else: page_number = total // page_size except Exception as e: print e for p_n in range(1, page_number + 1): req.set_PageNumber(p_n) response = c.do_action(req) instances = json.loads(response) for host_info in instances['Instances']['Instance']: region_id = host_info['RegionId'] eip = host_info['EipAddress']['IpAddress'] pip = host_info['PublicIpAddress']['IpAddress'] instance_name = host_info['InstanceName'] instance_id = host_info['InstanceId'] host_name = host_info['HostName'] if eip != "": self._instances.append( [region_id, instance_name, eip, instance_id]) elif len(pip) >= 1: self._instances.append( [region_id, instance_name, pip[0], instance_id])
def get_ecs_instances(): client = AcsClient( ECS_ACCESS_KEY_ID, ECS_ACCESS_SECRET, ECS_REGION_ID ); #ecs实例空字典 instances = {} page_size = 10 page_number = 1 total_count = None request = DescribeInstancesRequest() request.set_PageNumber(page_number) request.set_PageSize(page_size) #以{privateIP:InstanceName}的形式将实例的名字和私网ip添加到ecs实例字典里 while total_count is None or page_number * page_size < (total_count + page_size) : body = client.do_action_with_exception(request) data = json.loads(body) for instance in data['Instances']['Instance']: instances.update( { instance['VpcAttributes']['PrivateIpAddress']['IpAddress'][0] : instance['InstanceName'] }) total_count = data['TotalCount'] page_number += 1 request.set_PageNumber(page_number) print("获取阿里云ecs数据....共获取 %s 条数据。" %(len(instances)) ) return instances
def list_instance(): request = DescribeInstancesRequest() request.set_PageSize(100) request.set_PageNumber(1) response = _send_request(request) if response is not None: instance_list = response.get('Instances').get('Instance') result = map(_print_instance_info, instance_list) return result
def InstanceSync(regionId, pageSize, pageNum): client = AcsClient(accesskeyId, accessSecret, regionId) request = DescribeInstancesRequest() request.set_accept_format('json') request.set_PageSize(int(pageSize)) request.set_PageNumber(int(pageNum)) response = client.do_action_with_exception(request) data = json.loads(str(response, encoding='utf-8')) return data
def get_total_page_num(self, PageNum=1, PageSize=50): request = DescribeInstancesRequest() request.set_PageNumber(PageNum) request.set_PageSize(PageSize) response = self.get_action(request) if response['TotalCount'] % PageSize != 0: TotalPageNum = (response['TotalCount'] % PageSize) + 1 else: TotalPageNum = response['TotalCount'] % PageSize return TotalPageNum
def get_region_ecs_list(region, pageSize=50): request = DescribeInstancesRequest() for num in range(1, get_total_page_num(region) + 1): request.set_PageSize(pageSize) request.set_PageNumber(num) request.set_accept_format('json') response = get_client(region).do_action_with_exception(request) data = json.loads(str(response, encoding='utf-8')) for instance in data['Instances']['Instance']: save_Instance(instance)
def get_total_page_num(region, pageSize=50): request = DescribeInstancesRequest() request.set_PageNumber(1) request.set_PageSize(1) request.set_accept_format('json') response = get_client(region).do_action_with_exception(request) data = json.loads(str(response, encoding='utf-8')) pageNum = data['TotalCount'] // pageSize if data['TotalCount'] % pageSize != 0: pageNum += 1 return pageNum
def get_ecs_info(self): page_num = self.get_total_page_num() for i in range(1, page_num + 1): request = DescribeInstancesRequest() request.set_PageNumber(i) request.set_PageSize(50) response = self.get_action(request) ins_obj = response['Instances']['Instance'] self.instance_list_total.extend( self.formart_ins_info(x) for x in ins_obj)
def get_aliyun_hosts(self, register_prefix='', default_re='', extend_re='dev', project=''): client = AcsClient(self.accessKeyID, self.accessKeySecret, self.region) request = DescribeInstancesRequest() request.set_accept_format('json') request.set_PageNumber(1) request.set_PageSize(50) response = client.do_action_with_exception(request) data = json.loads(response) PageNumber = int(data['TotalCount'] / 50 + 2) list = [] search_shard = extend_mesage(project) for Number in range(1, PageNumber): request.set_PageNumber(Number) request.set_PageSize(50) response = client.do_action_with_exception(request) data = json.loads(response) for host in data['Instances']['Instance']: dict = {} id = re.split(r'-', host['SerialNumber']) id = ''.join(str(i) for i in id) dict['id'] = id dict['ip'] = host['NetworkInterfaces']['NetworkInterface'][0][ 'PrimaryIpAddress'] if register_prefix: dict['hostname'] = str( register_prefix) + host['InstanceName'] else: dict['hostname'] = host['InstanceName'] dict['is_active'] = 'true' dict['platform'] = "Linux" try: dict['comment'] = search_shard[dict['ip']] except KeyError: if 'Tags' in host: comment = host['Tags']['Tag'][0]['TagValue'] dict['comment'] = "[%s]" % comment else: dict['comment'] = "[123]" # if host['InstanceName'].startswith('G') or host['InstanceName'].startswith('c'): final_re = '|'.join( default_re.split('|') + extend_re.split('|')).strip('|') if re.search(final_re, host['InstanceName']): dict['group'] = ['dev'] else: dict['group'] = ['base'] list.append(dict) Log.debug(list) return list
def get_ecsinstances_info(self, format, page, limit): from aliyunsdkecs.request.v20140526.DescribeInstancesRequest import DescribeInstancesRequest request = DescribeInstancesRequest() request.set_accept_format(format) request.set_PageNumber(page) request.set_PageSize(limit) try: response = self.client.do_action_with_exception(request) except: return False return response
def ecs_detail(page_number=1): """ ecs实例详细信息 :param page_number: ecs页面页数 :return: """ request = DescribeInstancesRequest() request.set_accept_format('json') request.set_PageSize(100) request.set_PageNumber(page_number) response = client().do_action_with_exception(request) response = json.loads(response) return response
def get_ecses(self, instance_ids=[], page_num=1, page_size=20): request = DescribeInstancesRequest() request.set_accept_format('json') if instance_ids: request.set_InstanceIds(instance_ids) request.set_PageNumber(page_num) request.set_PageSize(page_size) data = self._request(request) total = data.get('TotalCount') data = data.get('Instances') data_list = data.get('Instance') data = { 'total': total, 'data_list': data_list, } return data
def getAliCloundEcsList(self,RegionId='cn-shenzhen',PageSize=15,Page=1,Tags=[]): client=AcsClient(self.secreyKey,self.accesssecret,RegionId) req=DescribeInstancesRequest() req.set_PageSize(PageSize) req.set_PageNumber(Page) if len(Tags)>0: req.set_Tags(Tags) req.set_accept_format('json') try: data=client.do_action_with_exception(req) if data: return data else: return False except Exception as e: logger.error(e) return False
def list_instances(TotalCount): ecs_list = [] for i in range(0, TotalCount / 100 + 1): request = DescribeInstancesRequest() request.set_accept_format('json') request.set_PageSize(100) request.set_PageNumber(i + 1) response_str = clt.do_action(request) response = json.loads(response_str) with open("c://Users/bobo/Desktop/aaa.json", "ab+") as f: f.write(response_str) # print response # sys.exit(1) if response is not None: ecs_list.extend(response.get('Instances').get('Instance')) with open("c://Users/bobo/Desktop/ass.json", "ab+") as f1: f1.write(repr(ecs_list)) return ecs_list
def __get_total_page_num(self, PageNum=1, PageSize=1): ''' 获取ECS总数,及当前页ECS列表 :param PageNum: 页ID :param PageSize: 页大小 :return: ''' request = DescribeInstancesRequest() request.set_PageNumber(PageNum) request.set_PageSize(PageSize) response = self.__do_action(request) if self.TotalPageNum != 0: ins_obj = response['Instances']['Instance'] self.instance_list_total.extend(ins_obj) return else: if int(response['TotalCount']) % self.PageSize != 0: self.TotalPageNum = int(response['TotalCount'] / self.PageSize) + 1 else: self.TotalPageNum = int(response['TotalCount'] / self.PageSize) return self.TotalPageNum
def remote_describeInstances(self, client, instanceIds=[]): """ 阿里云获取主机列表函数 :param client: aliclient obj :param instanceIds: default = [] :return: json """ retInstanceIds = [] for page in range(1, 999): # 超过9990机器神人耶 request = DescribeInstancesRequest() request.set_accept_format('json') request.set_PageNumber(page) request.set_PageSize(10) if instanceIds: request.set_InstanceIds(str(instanceIds)) response = client.do_action_with_exception(request) # python2: print(response) resp = json.loads(response) if not resp["Instances"]["Instance"]: break retInstanceIds.extend(resp["Instances"]["Instance"]) return retInstanceIds
def get_renew_instance_ids(self): """ 获取需要续费的实例ID :param instance_id: 实例ID列表 :return: """ start_time_utc = '2018-10-21T16:00Z' end_time_utc = '2018-12-01T16:00Z' page_num = 1 total_count = 1 instance_ids = [] while len(instance_ids) < total_count: request = DescribeInstancesRequest() request.set_Filter3Key(self.expired_start_time) request.set_Filter3Value(start_time_utc) request.set_Filter4Key(self.expired_end_time) request.set_Filter4Value(end_time_utc) request.set_InstanceChargeType(self.instance_charge_type) request.set_PageSize(self.page_size) request.set_PageNumber(page_num) body = self.client.do_action_with_exception(request) data = json.loads(body) if not data['TotalCount']: return instance_ids ids = [ str(instance['InstanceId']) for instance in data['Instances']['Instance'] ] instance_ids.extend(ids) total_count = data['TotalCount'] page_num += 1 print('Success. Instances which should be renewed include: {}'.format( ', '.join(instance_ids))) return instance_ids
class EcsInfo(): def __init__(self,access_key,access_secret,region_id): """ 1.传入账户信息 2.创建客户端连接 3.阿里云所有ecs服务器的详细信息列表 4.服务器同步 """ self.access_key = access_key self.access_secret = access_secret self.region_id=region_id self._request = DescribeInstancesRequest() self._request.set_accept_format('json') self._request.set_PageNumber(1) self._request.set_PageSize(100) self._connection = AcsClient(self.access_key, self.access_secret, region_id=self.region_id) self.aliyun_log = _LogFactory.get_logger('LOGGER') def get_instance_info(self): """ :return: ecs list """ self._server_list = [] val = 1 page_number = 1 while val==1: self._request.set_PageNumber(page_number) try: response = self._connection.do_action_with_exception(self._request) # self.aliyun_log.info(msg="aliyun连接成功") except Exception as e: self.aliyun_log.error(msg=e) return "阿里云连接失败,请查看日志" response_data = json.loads(str(response, encoding='utf-8')) ret = response_data['Instances']['Instance'] for i in ret: asset_data = {} asset_data['hostname'] = i.get('InstanceId') asset_data['remarks'] = i.get('InstanceName') # asset_data['region'] = i.get('ZoneId') # asset_data['instance_id'] = i.get('InstanceId') # asset_data['instance_type'] = i.get('InstanceType') asset_data['status'] = i.get('Status') asset_data['cpu'] = i.get('Cpu') asset_data['memory'] = i.get('Memory') # 单位换算G # asset_data['memory'] = str(int(i.get('Memory'))/1024) + 'G' # 内网IP try: # VPC里面内网IP asset_data['private_ip'] = i['VpcAttributes']['PrivateIpAddress']['IpAddress'][0] except (KeyError, IndexError): # 非VPC里面获取内网IP asset_data['private_ip'] = i['InnerIpAddress']['IpAddress'][0] # 公网IP/弹性IP try: asset_data['public_ip'] = i['PublicIpAddress']['IpAddress'][0] except(KeyError, IndexError): asset_data['public_ip'] = i['EipAddress']['IpAddress'] except Exception: asset_data['public_ip'] = asset_data['private_ip'] asset_data['os_name'] = i.get('OSName') self._server_list.append(asset_data) if response_data['Instances']['Instance']: val = 2 else: page_number += 1 return json.dumps(self._server_list,ensure_ascii=False)
class ECSInfo(): def __init__(self): """初始化构造函数""" self.client = AcsClient('<your_access_key>', '<your_access_secret>', 'cn-beijing') self.req = DescribeInstancesRequest() self.PageSize = 100 # 指定要写入的配置文件名称 self.file = "/usr/local/prometheus/targets/nodes/ecs_node.yaml" # 指定要备份的目录位置 self.bak = "/usr/local/prometheus/targets/nodes/" def info_template(self, page_num=1): to_list = lambda data: data["Instances"]["Instance"] # 初始化一个信息结果的列表 self.info_result = [] for instance in self.pager_generator(page_num, to_list): ecs_meta_info = ECSMeta(instance) target_info = { "targets": [ "{0}:{1}".format(ecs_meta_info.ip, ecs_meta_info.port), ], "labels": { "osname": ecs_meta_info.os_name, "instancename": ecs_meta_info.instance_name, "instanceid": ecs_meta_info.instance_id, "env": ecs_meta_info.env } } self.info_result.append(target_info) def write_info(self, backup=True): if backup: try: shutil.copyfile(self.file, self.bak + "ecs_node.yaml.bak") except Exception: pass with open(self.file, 'w', encoding="utf-8") as file_handler: yaml.dump(self.info_result, file_handler, default_flow_style=False, allow_unicode=True) # 获取所有ECS元数据列表 def pager_generator(self, page_num, to_list): # 构建一个分页用的生成器,因为所有的ecs可能一次请求是拿不完的,因此需要做分页的请求,默认的页码数是100 self.req.set_PageSize(self.PageSize) # 循环取数据 while True: # 首次默认的页码号为1 self.req.set_PageNumber(page_num) resp = self.client.do_action_with_exception(self.req) # 通过接口拿到的数据是bytes类型,所以要转换一下 data = json.loads(resp) # 使用to_list拿到对应的实例列表 instances = to_list(data) for instance in instances: yield instance # 仅当本次请求返回的页码数小于分页大小的时候,那么说明这是最后一页了,跳出循环 if len(instances) < self.PageSize: break # 如果不是最后一页的话,那么继续页码数+1,继续循环请求 page_num += 1
def DescribeInstances(ui, AccessKeyID, AccessKeySecret): ui.pushButton.setEnabled(False) ui.pushButton.setText('正在查询') RegionIds = { "cn-hangzhou": "华东1(杭州)", "cn-chengdu": "成都", "cn-qingdao": "华北1(青岛)", "cn-beijing": "华北2(北京)", "cn-huhehaote": "华北5(呼和浩特)", "cn-shanghai": "华东2(上海)", "cn-shenzhen": "华南1(深圳)", "cn-zhangjiakou": "华北3(张家口)", "cn-hongkong": "香港", "ap-southeast-1": "新加坡", "ap-southeast-2": "澳大利亚(悉尼)", "ap-southeast-3": "马来西亚(吉隆坡)", "ap-southeast-5": "印度尼西亚(雅加达)", "ap-northeast-1": "日本(东京)", "us-west-1": "美国(硅谷)", "us-east-1": "美国(弗吉尼亚)", "eu-central-1": "德国(法兰克福)", "me-east-1": "阿联酋(迪拜)", "ap-south-1": "印度(孟买)", "eu-west-1": "英国(伦敦)", "cn-shenzhen-finance-1": "深圳金融云", "cn-shanghai-finance-1": "上海金融云", "cn-north-2-gov-1": "华北 2 阿里政务云1", "cn-heyuan": "华南2(河源)" } for RegionId in RegionIds: client = AcsClient(AccessKeyID, AccessKeySecret, RegionId) # print(RegionId) try: request = DescribeInstancesRequest() request.set_accept_format('json') request.set_PageNumber(1) request.set_PageSize(100) response = client.do_action_with_exception(request) #print(json.loads(response)) except: #print('请检查输入Key与Secret值,或重新执行') ui.pushButton.setText('查询') ui.pushButton.setEnabled(True) return ui, '请检查输入Key与Secret值,或重新执行' if json.loads(response)['TotalCount'] == 0: #print(RegionId) if RegionId == 'cn-heyuan': ui.pushButton.setText('查询') ui.pushButton.setEnabled(True) return ui, '查询完成' else: continue # python2: print(response) # print(str(response, encoding='utf-8')) # item1 = json.loads(response)['Instances']['Instance'][0]['OSName'] PrivateIps = '' PublicIps = '' TotalCount = json.loads(response)['TotalCount'] pages = math.ceil(float(TotalCount / 100)) for page in range(pages): print(page) if page == pages - 1: num = TotalCount % 100 else: num = 100 for i in range(num): row_cnt = ui.tableWidget.rowCount() # 读取行 ui.tableWidget.insertRow(row_cnt) # 创建行 #print(json.loads(response)['Instances']['Instance'][i]['VpcAttributes']['PrivateIpAddress']['IpAddress']) for PrivateIp in json.loads(response)['Instances']['Instance'][ i]['VpcAttributes']['PrivateIpAddress']['IpAddress']: PrivateIps = str(PrivateIp) + ';' # print(PrivateIps) for PublicIp in json.loads(response)['Instances']['Instance'][ i]['PublicIpAddress']['IpAddress']: PublicIps = str(PublicIp) + ';' # print(PrivateIps) for SecurityGroup in json.loads(response)['Instances'][ 'Instance'][i]['SecurityGroupIds']['SecurityGroupId']: SecurityGroups = str(SecurityGroup) + ';' # print(PrivateIps) InstanceId = QTableWidgetItem( json.loads(response)['Instances']['Instance'][i] ['InstanceId']) RegionId = QTableWidgetItem(RegionIds[json.loads( response)['Instances']['Instance'][i]['RegionId']]) HostName = QTableWidgetItem( json.loads(response)['Instances']['Instance'][i] ['HostName']) OSName = QTableWidgetItem( json.loads(response)['Instances']['Instance'][i]['OSName']) InstanceNetworkType = QTableWidgetItem( json.loads(response)['Instances']['Instance'][i]['Status']) PrivateIpAddress = QTableWidgetItem(PrivateIps) PublicIpAddress = QTableWidgetItem(PublicIps) SecurityGroupIds = QTableWidgetItem(SecurityGroup) yunzhushou = QTableWidgetItem('待检测') performance = QTableWidgetItem( str( json.loads(response)['Instances']['Instance'][i] ['Cpu']) + '核处理器\n' + str( json.loads(response)['Instances']['Instance'][0] ['Memory']) + 'MB内存') CreationTime = QTableWidgetItem( json.loads(response)['Instances']['Instance'][i] ['CreationTime']) ExpiredTime = QTableWidgetItem( json.loads(response)['Instances']['Instance'][i] ['ExpiredTime']) ui.tableWidget.setItem(row_cnt, 0, InstanceId) ui.tableWidget.setItem(row_cnt, 1, RegionId) ui.tableWidget.setItem(row_cnt, 2, HostName) ui.tableWidget.setItem(row_cnt, 3, OSName) ui.tableWidget.setItem(row_cnt, 4, InstanceNetworkType) ui.tableWidget.setItem(row_cnt, 5, PrivateIpAddress) ui.tableWidget.setItem(row_cnt, 6, PublicIpAddress) ui.tableWidget.setItem(row_cnt, 7, SecurityGroupIds) ui.tableWidget.setItem(row_cnt, 8, yunzhushou) ui.tableWidget.setItem(row_cnt, 9, performance) ui.tableWidget.setItem(row_cnt, 10, CreationTime) ui.tableWidget.setItem(row_cnt, 11, ExpiredTime)