阿裏雲通過API 創建ECS主機示例
阿新 • • 發佈:2018-09-12
api epub .get pcs ecs utf-8 Nid desc json SDK
aliyun-python-sdk-core-v3==2.9.1
aliyun-python-sdk-ecs==4.10.1
腳本
AccessKeyId = ‘xxxxxxxxxxxxx‘ AccessKeySecret = ‘xxxxxxxxxxxxxxxx‘ City = ‘cn-beijing‘ import time import re import logging from aliyunsdkcore import client from aliyunsdkecs.request.v20140526 import DescribeInstancesRequest, DescribeRegionsRequest, DescribeAvailableResourceRequest, DescribeImagesRequest, DescribeSecurityGroupsRequest, DescribeVpcsRequest, DescribeVSwitchesRequest,CreateInstanceRequest,AllocatePublicIpAddre***equest,StartInstanceRequest import json logger = logging.getLogger(‘test‘) class AliyunEcsCreate(object): def __init__(self, AccessKeyId, AccessKeySecret, City): self.AccessKeyId = AccessKeyId self.AccessKeySecret = AccessKeySecret self.City = City def DescribeRegions(self): """ 地域 :return: {‘cn-qingdao‘: ‘華北 1‘} """ regionsclt = client.AcsClient(self.AccessKeyId, self.AccessKeySecret) regionsreq = DescribeRegionsRequest.DescribeRegionsRequest() regionsreq.set_accept_format(‘json‘) regionsre = json.loads(regionsclt.do_action_with_exception(regionsreq), encoding=‘utf-8‘) regions = {} for i in regionsre[‘Regions‘][‘Region‘]: regions[i[‘RegionId‘]] = i[‘LocalName‘] return regions def DescribeAvailableResource(self, InstanceChargeType, region_id, DestinationResource, ZoneId=None): """ 可用資源查詢接口 :param region_id: 地域 :param DestinationResource: 查詢的資源類型 :return: """ resourceclt = client.AcsClient(self.AccessKeyId, self.AccessKeySecret, region_id) resourcereq = DescribeAvailableResourceRequest.DescribeAvailableResourceRequest() if DestinationResource == ‘InstanceType‘: resourcereq.set_ZoneId(ZoneId) resourcereq.set_IoOptimized(‘optimized‘) resourcereq.set_InstanceChargeType(InstanceChargeType) resourcereq.set_DestinationResource(DestinationResource) resourcereq.set_accept_format(‘json‘) resourcere = json.loads(resourceclt.do_action_with_exception(resourcereq), encoding=‘utf-8‘) return resourcere def AvailableZones(self, InstanceChargeType, region_id): """ 可用區 :param region_id: 計費方式 地域 :return: [‘cn-huhehaote-a‘, ‘cn-huhehaote-b‘] """ zonesre = self.DescribeAvailableResource(InstanceChargeType, region_id, ‘Zone‘) zones = [] for i in zonesre[‘AvailableZones‘][‘AvailableZone‘]: zones.append(i[‘ZoneId‘]) return zones def AvailableInstanceType(self, InstanceChargeType, region_id, ZoneId): """ 可用實例規格 :param region_id: 計費方式 地域 可用區 :return: 計算型 ecs.c5 商用 入門級 ecs.t5 測試 預發布 """ instanceres = self.DescribeAvailableResource(InstanceChargeType, region_id, ‘InstanceType‘, ZoneId) instance = [] for i in instanceres[‘AvailableZones‘][‘AvailableZone‘][0][‘AvailableResources‘][‘AvailableResource‘][0][‘SupportedResources‘][‘SupportedResource‘]: if re.match(‘ecs.t5‘, i[‘Value‘]) or re.match(‘ecs.c5‘, i[‘Value‘]): instance.append(i[‘Value‘]) c5 = {‘ecs.c5.large‘: ‘2*4‘, ‘ecs.c5.xlarge‘: ‘4*8‘, ‘ecs.c5.2xlarge‘: ‘8*16‘} t5 = {‘ecs.t5-lc2m1.nano‘:‘1*0.5‘,‘ecs.t5-lc1m2.small‘: ‘1*2‘, ‘ecs.t5-c1m2.large‘: ‘2*4‘, ‘ecs.t5-lc1m4.large‘: ‘2*8‘} for k in list(c5.keys()): if k not in instance: del c5[k] for k in list(t5.keys()): if k not in instance: del t5[k] return c5, t5 def DescribeImages(self, region_id): """ :param region_id: 地域 :return: 鏡像列表 {‘centos_6_09_64_20G_alibase_20180326.vhd‘: ‘CentOS 6.9 64位‘,} """ imagesclt = client.AcsClient(self.AccessKeyId, self.AccessKeySecret, region_id) imagesreq = DescribeImagesRequest.DescribeImagesRequest() imagesreq.set_ActionType(‘DescribeImages‘) imagesreq.set_accept_format(‘json‘) imagesreq.set_PageSize(100) imagesre = json.loads(imagesclt.do_action_with_exception(imagesreq), encoding=‘utf-8‘) images = {} for i in imagesre[‘Images‘][‘Image‘]: if i[‘Platform‘] == ‘CentOS‘: images[i[‘ImageId‘]] = i[‘OSName‘] return images def DescribeVpcs(self, region_id): """ VPC :param region_id: 地域 :return: {‘vpc-hp33ep5m55q5vdebkjpxk‘: ‘華北5預發布VPC‘, ‘vpc-hp3xfrxc78pgc0rianhge‘: ‘華北5測試‘} """ vpcsclt = client.AcsClient(self.AccessKeyId, self.AccessKeySecret, region_id) vpcsreq = DescribeVpcsRequest.DescribeVpcsRequest() vpcsreq.set_action_name(‘DescribeVpcs‘) vpcsreq.set_accept_format(‘json‘) vpcsreq.set_PageSize(50) vpcsre = json.loads(vpcsclt.do_action_with_exception(vpcsreq), encoding=‘utf-8‘) vpcs = {} for i in vpcsre[‘Vpcs‘][‘Vpc‘]: vpcs[i[‘VpcId‘]] = i[‘VpcName‘] return vpcs def DescribeVSwitches(self, region_id, zone_id, vpc_id): """ :param region_id: 地域 :param zone_id: 可用區 :param vpc_id: vpc :return: {‘vsw-hp3ffb8524tt1gqp22utj‘: ‘華北5測試B交換機‘} """ vswitchesclt = client.AcsClient(self.AccessKeyId, self.AccessKeySecret, region_id) vswitchesreq = DescribeVSwitchesRequest.DescribeVSwitchesRequest() vswitchesreq.set_action_name(‘DescribeVSwitches‘) vswitchesreq.set_VpcId(vpc_id) vswitchesreq.set_accept_format(‘json‘) vswitchesreq.set_PageSize(50) vswitchesreq.set_ZoneId(zone_id) vswitchesre = json.loads(vswitchesclt.do_action_with_exception(vswitchesreq), encoding=‘utf-8‘) vswitches = {} for i in vswitchesre[‘VSwitches‘][‘VSwitch‘]: vswitches[i[‘VSwitchId‘]] = i[‘VSwitchName‘] return vswitches def DescribeSecurityGroups(self,region_id,vpc_id,): """ 安全組 :param region_id: 地域 :param vpc_id: vpc :return: {‘sg-hp3738k45fqqbfja11fl‘: ‘華北5測試2‘, ‘sg-hp3hzvhrr2gk8skyo3ul‘: ‘華北5測試1‘} """ groupsclt = client.AcsClient(self.AccessKeyId, self.AccessKeySecret, region_id) groupsreq = DescribeSecurityGroupsRequest.DescribeSecurityGroupsRequest() groupsreq.set_action_name(‘DescribeSecurityGroups‘) groupsreq.set_VpcId(vpc_id) groupsreq.set_accept_format(‘json‘) groupsreq.set_PageSize(50) groupsre = json.loads(groupsclt.do_action_with_exception(groupsreq), encoding=‘utf-8‘) groups = {} for i in groupsre[‘SecurityGroups‘][‘SecurityGroup‘]: groups[i[‘SecurityGroupId‘]]=i[‘SecurityGroupName‘] return groups def CreateInstance(self,region_id,ZoneId,ImageId,InstanceType,InstanceName,InstanceChargeType,InternetChargeType, InternetMaxBandwidthOut,HostName,Password,VSwitchId,SecurityGroupId,Size): """ 創建 實例 :param region_id: 地域 :param ZoneId: 可用區 :param ImageId: 鏡像 :param InstanceType: 實例模板 :param InstanceName: 實例名字 :param InstanceChargeType: 計費方式 :param InternetChargeType: 網絡計費方式 :param InternetMaxBandwidthOut: 出網帶寬 :param HostName: 主機名字 :param Password: 密碼 :param VSwitchId: 交換機 :param SecurityGroupId: 安全組 :param Size: 數據盤 默認為None 20 :return: {‘InstanceId‘: ‘i-2ze210z0uiwyadm1m7x6‘} """ createclt = client.AcsClient(self.AccessKeyId, self.AccessKeySecret, region_id) createreq = CreateInstanceRequest.CreateInstanceRequest() createreq.set_action_name(‘CreateInstance‘) createreq.set_accept_format(‘json‘) createreq.set_ZoneId(ZoneId) createreq.set_ImageId(ImageId) createreq.set_InstanceType(InstanceType) createreq.set_InstanceName(InstanceName) createreq.set_InstanceChargeType(InstanceChargeType) if InstanceChargeType == ‘PrePaid‘: createreq.set_Period(‘1‘) if InternetChargeType: createreq.set_InternetChargeType(InternetChargeType) createreq.set_InternetMaxBandwidthOut(InternetMaxBandwidthOut) createreq.set_HostName(HostName) createreq.set_Password(Password) createreq.set_VSwitchId(VSwitchId) createreq.set_SecurityGroupId(SecurityGroupId) if Size != 0: createreq.set_DataDisks([{‘Size‘:Size,‘Category‘:‘cloud_efficiency‘}]) createre = json.loads(createclt.do_action_with_exception(createreq), encoding=‘utf-8‘) return createre def AllocatePublicIpAddress(self,region_id,InstanceId): """ 綁定外網IP :param region_id: 地域 :param InstanceId: 實例ID :return: {‘IpAddress‘: ‘39.106.176.130‘} """ ipclt = client.AcsClient(self.AccessKeyId, self.AccessKeySecret, region_id) ipreq = AllocatePublicIpAddre***equest.AllocatePublicIpAddre***equest() ipreq.set_action_name(‘AllocatePublicIpAddress‘) ipreq.set_accept_format(‘json‘) ipreq.set_InstanceId(InstanceId) ipre = json.loads(ipclt.do_action_with_exception(ipreq), encoding=‘utf-8‘) return ipre def StartInstance(self,region_id,InstanceId): """ 啟動實例 :param region_id: 地域 :param InstanceId: 實例ID :return: """ startclt = client.AcsClient(self.AccessKeyId, self.AccessKeySecret, region_id) startreq = StartInstanceRequest.StartInstanceRequest() startreq.set_action_name(‘StartInstance‘) startreq.set_accept_format(‘json‘) startreq.set_InstanceId(InstanceId) start = json.loads(startclt.do_action_with_exception(startreq), encoding=‘utf-8‘) return start if __name__ == ‘__main__‘: create = AliyunEcsCreate(AccessKeyId, AccessKeySecret, City) regions = create.DescribeRegions() zones = create.AvailableZones(‘PostPaid‘, ‘cn-beijing‘) c5, t5 = create.AvailableInstanceType(‘PostPaid‘, ‘cn-beijing‘, ‘cn-beijing-f‘) images = create.DescribeImages(‘cn-beijing‘) vpcs= create.DescribeVpcs(‘cn-beijing‘) vswitches = create.DescribeVSwitches(‘cn-beijing‘, ‘cn-beijing-f‘,‘vpc-2zetvr99gw5dz5xfeouvo‘) groups = create.DescribeSecurityGroups(‘cn-beijing‘,‘vpc-2zetvr99gw5dz5xfeouvo‘) print(regions) print(zones) print(c5,t5) print(images) print(vpcs) print(vswitches) print(groups) createecs = create.CreateInstance(region_id=‘cn-beijing‘,ZoneId=‘cn-beijing-f‘,ImageId=‘centos_7_04_64_20G_alibase_201701015.vhd‘, InstanceType=‘ecs.t5-lc2m1.nano‘,InstanceName=‘test.test.com‘,InstanceChargeType=‘PostPaid‘, InternetChargeType=‘PayByBandwidth‘,InternetMaxBandwidthOut=‘1‘,HostName=‘test.test.com‘, Password=‘1qaz.2wsx‘,VSwitchId=‘vsw-2ze1c3ty3fj74rr16n1c4‘,SecurityGroupId=‘sg-2zeg2nvydu16ikvppjm7‘, Size=0) time.sleep(20) ipaddr = create.AllocatePublicIpAddress(‘cn-beijing‘,createecs[‘InstanceId‘]) start = create.StartInstance(‘cn-beijing‘,createecs[‘InstanceId‘])
參考官方文檔
https://help.aliyun.com/document_detail/25499.html?spm=a2c4e.11153940.blogcont69142.16.3ba53fb4gmW2LU
阿裏雲通過API 創建ECS主機示例