class EcsIdToIp(Aliyunsdk): """ 为构造函数提供ECS ID, 执行run方法得到ECS 内网IP,外网IP,名称及区域 """ def __init__(self, ecsid): Aliyunsdk.__init__(self) self.ecsid = ecsid self.resultFormat = resultFormat self.request = DescribeInstancesRequest() self.request.set_accept_format(self.resultFormat) self.request.set_InstanceIds([self.ecsid]) def handling(self): try: self.publicIp = self.result['Instances']['Instance'][0][ 'PublicIpAddress']['IpAddress'][0] #外网IP self.innerIp = self.result['Instances']['Instance'][0][ 'InnerIpAddress']['IpAddress'][0] #内网IP self.instanceName = self.result['Instances']['Instance'][0][ 'InstanceName'] #名称 self.regionId = self.result['Instances']['Instance'][0][ 'RegionId'] #区域 Aliyunsdk.handling(self) except IndexError: print('ID: %s is not exist' % self.ecsid) os._exit(17)
def _check_instances_status(self, instance_ids): """ 每3秒中检查一次实例的状态,超时时间设为3分钟. :param instance_ids 需要检查的实例ID :return: """ start = time.time() while True: request = DescribeInstancesRequest() request.set_InstanceIds(json.dumps(instance_ids)) body = self.client.do_action_with_exception(request) data = json.loads(body) for instance in data['Instances']['Instance']: if RUNNING_STATUS in instance['Status']: instance_ids.remove(instance['InstanceId']) print('Instance boot successfully: {}'.format( instance['InstanceId'])) if not instance_ids: print('Instances all boot successfully') break if time.time() - start > CHECK_TIMEOUT: print('Instances boot failed within {timeout}s: {ids}'.format( timeout=CHECK_TIMEOUT, ids=', '.join(instance_ids))) break time.sleep(CHECK_INTERVAL)
def check_instance_status(self, instance_id): """ 获取instance_id 和 instance状态 :return: """ start = time.time() host_list = [] while True: request = DescribeInstancesRequest() request.set_InstanceIds(json.dumps(instance_id)) body = self.client.do_action_with_exception(request) data = json.loads(body) for instance in data['Instances']['Instance']: if RUNNING_STATUS in instance['Status']: instance_id.remove(instance['InstanceId']) print('Instance boot successfully: {}'.format( instance['InstanceId'])) host_list.append({"host": instance['VpcAttributes']['PrivateIpAddress']['IpAddress'][0], "password": self.password, "hostname": instance['InstanceName']}) if not instance_id: print('Instances all boot successfully') break # 大于3分钟退出 if time.time() - start > CHECK_TIMEOUT: print('Instances boot failed within {timeout}s: {ids}' .format(timeout=CHECK_TIMEOUT, ids=', '.join(instance_id))) break # 每三秒钟检查一次 time.sleep(CHECK_INTERVAL) # 输出主机连接信息 return host_list
def describe_instances(self): """ 获取实例信息 :return: 实例信息列表 """ offset = 0 total_count = len(self.instance_ids) instances = [] while offset < total_count: ids = self.instance_ids[offset:min(offset + self.page_size, total_count)] request = DescribeInstancesRequest() request.set_PageSize(self.page_size) request.set_InstanceChargeType(self.instance_charge_type) request.set_InstanceIds(ids) body = self.client.do_action_with_exception(request) data = json.loads(body) ins = data['Instances']['Instance'] ret_instance_ids = [instance['InstanceId'] for instance in ins] invalid_instance_ids = set(ids) - set(ret_instance_ids) if invalid_instance_ids: raise InvalidInstanceId('Fail. Invalid InstanceIds: {}'.format( ', '.join(invalid_instance_ids))) instances.extend(ins) offset += self.page_size return instances
def Linux_Cmd_Exec(ALIYUN_ACCESSKEYID, ALIYUN_ACCESSKEYSECRET, ZhuJi_ID, Zhuji_Aliyun_City_Host): client = AcsClient(ALIYUN_ACCESSKEYID, ALIYUN_ACCESSKEYSECRET, Zhuji_Aliyun_City_Host) request = DescribeInstancesRequest() request.set_accept_format('json') InstanceId = [ZhuJi_ID] request.set_InstanceIds(InstanceId) response = client.do_action_with_exception(request) response = str(response, encoding='utf-8') print(""" \033[1;31m --------------------------------------------------------------------------------\033[0m \033[1;31m - +-------+ \033[0m \033[1;31m - | Linux | OS: %s \033[0m \033[1;31m - | | --------> IP: %s \033[0m \033[1;31m - | | Name: %s \033[0m \033[1;31m - +-------+ \033[0m \033[1;31m --------------------------------------------------------------------------------\033[0m """ % (json.loads(response)['Instances']['Instance'][0]['OSName'], json.loads(response)['Instances'] ['Instance'][0]['PublicIpAddress']['IpAddress'][0], json.loads(response)['Instances']['Instance'][0]['InstanceName'])) while True: Cmd = str(input("\033[5;37m[root@{}~]# \033[0m".format(ZhuJi_ID))) if Cmd == "exit": print("\033[1;31m-正在退出主机..... {} \033[0m".format(ZhuJi_ID)) break Linux_exec(client, Cmd, ZhuJi_ID)
def Aliyun_Serve_test(ALIYUN_ACCESSKEYID, ALIYUN_ACCESSKEYSECRET, InstanceId, Aliyun_City_Host, NUM, Aliyun_Serve_test_dict): client = AcsClient(ALIYUN_ACCESSKEYID, ALIYUN_ACCESSKEYSECRET, Aliyun_City_Host) request = DescribeInstancesRequest() request.set_accept_format('json') InstanceId = [InstanceId] request.set_InstanceIds(InstanceId) response = client.do_action_with_exception(request) response = str(response, encoding='utf-8') NUM = int(NUM) + 1 OSName = json.loads(response)['Instances']['Instance'][0]['OSName'] if "Windows" in OSName: OS = "Windows" else: OS = "Linux" IpAddress_1 = json.loads(response)['Instances']['Instance'][0][ 'VpcAttributes']['PrivateIpAddress']['IpAddress'][0] IpAddress_2 = json.loads(response)['Instances']['Instance'][0][ 'PublicIpAddress']['IpAddress'][0] InstanceName = json.loads( response)['Instances']['Instance'][0]['InstanceName'] InstanceId = InstanceId[0] Aliyun_Serve_test_dict.append({ "InstanceId": InstanceId, "Aliyun_City_Host": Aliyun_City_Host, "OS": OS }) print( "\033[1;34m ({}) 主机ID: {} 系统名称: {} \n 外网IP: {}\n 内网IP: {} \n 服务器名: {}\n \033[0m" .format(NUM, InstanceId, OSName, IpAddress_2, IpAddress_1, InstanceName))
def eip(self, instance_id): """ :argument instance_id - ecs instance id *************** :return: ecs """ request = DescribeInstancesRequest() request.set_accept_format('json') request.set_InstanceIds("['%s']" % instance_id) try: logging.info("Start to get eip for instance %s." % instance_id) response = self.client.do_action_with_exception(request) if ResponseUtil.success(response): eip = get_instance_eip(str(response, encoding='utf-8')) if not instance_id: raise ValueError("Eip NullPointException") logging.info("Get eip : %s for instance : %s." % (eip, instance_id)) return True, eip else: return False, str(response, encoding='utf-8') except Exception as e: logging.error( "Failed to get eip for instance %s, cause by exception : " % instance_id, e) return False, e
def describe_instance(client: AcsClient, instance_id: str): request = DescribeInstancesRequest() request.set_accept_format('json') request.set_InstanceIds(f'''["{instance_id}"]''') response = client.do_action_with_exception(request) response_str = response.decode() response_data: dict = json.loads(response_str) if response_data["TotalCount"] == 0: print(response_str) raise ValueError("没有可用的实例,请检查InstanceId是否正确.") status = response_data['Instances']['Instance'][0]['Status'] ip = "" if status == "Running": ip_data = response_data['Instances']['Instance'][0]['PublicIpAddress'] if "IpAddress" in ip_data and len(ip_data["IpAddress"]) > 0: ip = ip_data["IpAddress"][0] elif status == "Stopping" or status == "Starting": pass elif status == "Stopped": pass else: print(response_str) raise ValueError(f"无效的状态: {status}") return status, ip
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 refresh(self): request = DescribeInstancesRequest() request.set_InstanceIds(json.dumps([self.instance_id])) items = _get_response(self._client, request, {}, 'Instances.Instance') if not items: raise ClientException(errors.ERROR_INVALID_SERVER_RESPONSE, "Failed to find instance data from DescribeInstances response. " "InstanceId = {0}".format(self.instance_id)) self._assign_attributes(items[0])
def get_instance_ip_by_id(instance_id): logging.info("Check instance_id %s", instance_id) request = DescribeInstancesRequest() request.set_PageSize(100) id = json.dumps([instance_id]) request.set_InstanceIds(id) response = _send_request(request) ip = response.get("Instances").get("Instance")[0].get("VpcAttributes").get( "PrivateIpAddress").get("IpAddress")[0] return ip
def getInstance(client, instance_name=None, instance_ids=None): request = DescribeInstancesRequest() request.set_accept_format('json') if instance_ids: request.set_InstanceIds(instance_ids) if instance_name: request.set_InstanceName(instance_name) response = client.do_action_with_exception(request) return response
def get_status(conn, instance_id): request = DescribeInstancesRequest() request.set_InstanceIds(json.dumps([instance_id])) response = _send_request(conn, request) instance_status = None if response is not None: instance_list = response.get('Instances').get('Instance') for item in instance_list: instance_status = item.get('Status') return instance_status
def status_verify(self, instance): request = DescribeInstancesRequest() request.set_InstanceIds(json.dumps([instance.instance_id])) response = self.client.do_action_with_exception(request) obj = json.loads(response.decode('utf-8'))['Instances']['Instance'][0] for key, value in iteritems(obj): attr_name = self._convert_camel_to_snake(key) self.assertTrue(hasattr(instance, attr_name), "instance has no " + attr_name) self.assertEqual(obj[key], getattr(instance, attr_name))
def check_instance_running(instance_ids): request = DescribeInstancesRequest() request.set_InstanceIds(json.dumps(instance_ids)) response = _send_request(request) if response.get('Code') is None: instances_list = response.get('Instances').get('Instance') running_count = 0 for instance_detail in instances_list: if instance_detail.get('Status') == "Starting": running_count += 1 return running_count
def _get_instance_status_by_id(self, instance_id): request = DescribeInstancesRequest() request.set_InstanceIds(json.dumps([instance_id])) response = self._send_request(request) instance_detail = None if response is not None: instance_list = response.get('Instances').get('Instance') for item in instance_list: return item.get('Status') else: return None
def _ecs_filter_request(self): request = DescribeInstancesRequest() request.set_PageSize(100) if ECS_ZONE_ID: request.set_ZoneId(ECS_ZONE_ID) if ECS_VPC_ID: request.set_VpcId(ECS_VPC_ID) if ECS_VSWITCH_ID: request.set_VSwitchId(ECS_VSWITCH_ID) if ECS_SECURITY_GROUP_ID: request.set_SecurityGroupId(ECS_SECURITY_GROUP_ID) if ECS_RESOURCE_GROUP_ID: request.set_ResourceGroupId(ECS_RESOURCE_GROUP_ID) if ECS_INSTANCE_IDS: request.set_InstanceIds(json.dumps(ECS_INSTANCE_IDS.split())) return request
def get_instance_detail_by_id(instance_id, status='Stopped'): logging.info("Check instance %s status is %s", instance_id, status) request = DescribeInstancesRequest() request.set_InstanceIds(json.dumps([instance_id])) response = _send_request(request) instance_detail = None if response is not None: instance_list = response.get('Instances').get('Instance') for item in instance_list: if item.get('Status') == status: instance_detail = item break return instance_detail
def describe_instance_detail(instance_id): """ describe instance detail :param instance_id: instance id of the ecs instance, like 'i-***'. :return: """ request = DescribeInstancesRequest() request.set_InstanceIds(json.dumps([instance_id])) response = _send_request(request) if response is not None: instance_list = response.get('Instances').get('Instance') if len(instance_list) > 0: return instance_list[0]
def get_ecsinstance_info(self, format, page, limit, instanceid): from aliyunsdkecs.request.v20140526.DescribeInstancesRequest import DescribeInstancesRequest request = DescribeInstancesRequest() request.set_accept_format(format) request.set_InstanceIds([instanceid]) request.set_PageNumber(page) request.set_PageSize(limit) try: response = self.client.do_action_with_exception(request) except: return False return response
def get_aliecs_info(instance_id): client = AcsClient(accessKeyId, accessSecret, regionId) request = DescribeInstancesRequest() request.set_accept_format('json') instnce_id_data = [] instnce_id_data.append(instance_id) # print(instnce_id_data) request.set_InstanceIds(instnce_id_data) response = client.do_action_with_exception(request) res = json.loads(str(response, encoding='utf-8')) disks_info = get_instance_disk_info(instance_id) # print(disks_info) res['disk_infos'] = disks_info return res
def DescribeInstances(ak, sk, region_tag, instance_id): client = AcsClient(ak, sk, region_tag) request = DescribeInstancesRequest() request.set_accept_format('json') request.set_InstanceIds("['" + instance_id +"']") response = client.do_action_with_exception(request) result = str(response, encoding='utf-8') data = json.loads(result) vpc_ip = data["Instances"]["Instance"][0]["NetworkInterfaces"]["NetworkInterface"][0]["PrimaryIpAddress"] f = open('/etc/ansible/hosts','a') f.write(vpc_ip + ":34872 ") f.write('\n') f.close() print ("新购买的服务器已经添加到ansible名单里!")
def info(region_instance_id_list): # Arg region_instance_id_list [[region_id, instance_id], [region_id, instance_id]...] # Return [Info, Info...] info_list = [] for (region_id, instance_id) in region_instance_id_list: client = AcsClient( conf.secret["aliyun"]["access_key"], conf.secret["aliyun"]["access_secret"], region_id, ) req = DescribeInstancesRequest() req.set_accept_format("json") req.set_InstanceIds([instance_id]) res = json.loads(client.do_action_with_exception(req)) info_list.append(res["Instances"]["Instance"][0]) return info_list
def _get_instance(self): """Retrieve instance matching instance_id.""" client = self._connect() request = DescribeInstancesRequest() request.set_accept_format('json') request.set_InstanceIds(json.dumps([self.running_instance_id])) try: response = json.loads(client.do_action_with_exception(request)) instance = response['Instances']['Instance'][0] except Exception: raise AliyunCloudException( 'Instance with ID: {instance_id} not found.'.format( instance_id=self.running_instance_id)) return instance
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 check_spot_callback(self, instance_id): request = DescribeInstancesRequest() request.set_accept_format('json') request.set_InstanceIds([instance_id]) status = False try: response = self.client.do_action_with_exception(request) response = json.loads(response) if len(response["Instances"] ["Instance"]) == 1 and "Recycling" in response["Instances"][ "Instance"][0]["OperationLocks"]["LockReason"]: status = True if instance_id not in self.describe_apg_instances(): status = True except: pass return status
def describe_instances(self, tags=None, instance_ids=None): """ Query the details of one or more Elastic Compute Service (ECS) instances. :param tags: The tags of the instance. :param instance_ids: The IDs of ECS instances :return: ECS instance list """ request = DescribeInstancesRequest() if tags is not None: request.set_Tags(tags) if instance_ids is not None: request.set_InstanceIds(instance_ids) response = self._send_request(request) if response is not None: instance_list = response.get("Instances").get("Instance") return instance_list return None
def get_ip(self, instance_list): request = DescribeInstancesRequest() request.set_accept_format('json') ip_list = [] if len(instance_list) <= 10: for i in range(len(instance_list)): request.set_InstanceIds([instance_list[i]]) response = self.client.do_action_with_exception(request) response = json.loads(response) ip_list.append( response["Instances"]["Instance"][0]["VpcAttributes"] ["PrivateIpAddress"]['IpAddress'][0]) else: iteration = len(instance_list) // 10 for i in range(iteration): for j in range(10): request.set_InstanceIds([instance_list[i * 10 + j]]) response = self.client.do_action_with_exception(request) response = json.loads(response) ip_list.append( response["Instances"]["Instance"][0]["VpcAttributes"] ["PrivateIpAddress"]['IpAddress'][0]) if len(instance_list) - iteration * 10 != 0: for j in range(len(instance_list) - iteration * 10): request.set_InstanceIds( [instance_list[iteration * 10 + j]]) response = self.client.do_action_with_exception(request) response = json.loads(response) ip_list.append( response["Instances"]["Instance"][0]["VpcAttributes"] ["PrivateIpAddress"]['IpAddress'][0]) return ip_list
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_ecs_info(self, ecs_id): """ get ecs ip and hostname :param ecs_id: :return: """ ip, hostname = None, None try: request = DescribeInstancesRequest() request.set_accept_format('json') request.set_InstanceIds([ ecs_id, ]) response = json.loads( self.client.do_action_with_exception(request)) # 私有网络IP ip = response.get("Instances").get("Instance")[0].get( "VpcAttributes").get("PrivateIpAddress").get("IpAddress")[0] hostname = response.get("Instances").get("Instance")[0].get( "HostName") except ServerException as exc: logs.error("get ecs info failed msg is {}".format(exc)) finally: return ip, hostname