Beispiel #1
0
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)
Beispiel #3
0
    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
Beispiel #4
0
 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
Beispiel #5
0
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)
Beispiel #6
0
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))
Beispiel #7
0
 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
Beispiel #8
0
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
Beispiel #9
0
    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
Beispiel #10
0
 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
Beispiel #12
0
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
Beispiel #13
0
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))
Beispiel #15
0
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
Beispiel #16
0
 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
Beispiel #17
0
 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
Beispiel #18
0
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
Beispiel #19
0
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]
Beispiel #20
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
Beispiel #21
0
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
Beispiel #22
0
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名单里!")
Beispiel #23
0
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
Beispiel #24
0
    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
Beispiel #25
0
    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
Beispiel #26
0
 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
Beispiel #27
0
    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
Beispiel #28
0
 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
Beispiel #29
0
    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
Beispiel #30
0
 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