|
@@ -0,0 +1,166 @@
|
|
|
+# #!/usr/bin/env python
|
|
|
+# #coding=utf-8
|
|
|
+#
|
|
|
+import json
|
|
|
+import logging
|
|
|
+import time
|
|
|
+import requests
|
|
|
+import sys
|
|
|
+from aliyunsdkcore import client
|
|
|
+from aliyunsdkcore.client import AcsClient
|
|
|
+from aliyunsdkcore.acs_exception.exceptions import ClientException
|
|
|
+from aliyunsdkcore.acs_exception.exceptions import ServerException
|
|
|
+from aliyunsdkecs.request.v20140526.CreateInstanceRequest import CreateInstanceRequest
|
|
|
+from aliyunsdkecs.request.v20140526.StartInstanceRequest import StartInstanceRequest
|
|
|
+from aliyunsdkecs.request.v20140526.DescribeInstancesRequest import DescribeInstancesRequest
|
|
|
+from aliyunsdkecs.request.v20140526.RunInstancesRequest import RunInstancesRequest
|
|
|
+from aliyunsdkecs.request.v20140526.DescribeNetworkInterfacesRequest import DescribeNetworkInterfacesRequest
|
|
|
+from aliyunsdkslb.request.v20140515.AddBackendServersRequest import AddBackendServersRequest
|
|
|
+from aliyunsdkecs.request.v20140526.RunCommandRequest import RunCommandRequest
|
|
|
+
|
|
|
+
|
|
|
+logging.basicConfig(level=logging.INFO,
|
|
|
+ format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
|
|
|
+ datefmt='%a, %d %b %Y %H:%M:%S')
|
|
|
+ak_id = "LTAI4GBWbFvvXoXsSVBe1o9f"
|
|
|
+ak_secret = "kRAikWitb4kDxaAyBqNrmLmllMEDO3"
|
|
|
+region_id = "cn-hangzhou"
|
|
|
+clt = client.AcsClient(ak_id, ak_secret, region_id)
|
|
|
+instance_type = "ecs.c6.2xlarge"
|
|
|
+vswitch_id = "vsw-bp19lpjwtc6j0p0m9mdc2"
|
|
|
+image_id = "m-bp15xqcuacm4zw2h2gi6"
|
|
|
+security_group_id = "sg-bp1irhrkr4vfj272hk4y"
|
|
|
+amount = int(sys.argv[1])
|
|
|
+AccessKey = 'LTAIuPbTPL3LDDKN'
|
|
|
+AccessSecret = 'ORcNedKwWuwVtcq4IRFtUDZgS0b1le'
|
|
|
+RegionId = 'cn-hangzhou'
|
|
|
+disk_size = "200"
|
|
|
+instance_name = "ESS-clipapi-[1,2]"
|
|
|
+zone_id = "cn-hangzhou-h"
|
|
|
+disk_category = "cloud_efficiency"
|
|
|
+key_pair_name = "stuuudy"
|
|
|
+#slb_id = "lb-bp1r9duz4k7z0riz9zs3n"
|
|
|
+#vlogapi
|
|
|
+slb_id = "lb-bp1ouhx77itpk5xozmeu5"
|
|
|
+
|
|
|
+client = AcsClient (AccessKey, AccessSecret, RegionId)
|
|
|
+
|
|
|
+
|
|
|
+def addBackendServers(slb_id,instance_id):
|
|
|
+ request = AddBackendServersRequest()
|
|
|
+ request.set_accept_format('json')
|
|
|
+ ipaddr = getIpaddr(instance_id)
|
|
|
+ request.set_LoadBalancerId(slb_id)
|
|
|
+
|
|
|
+ request.set_BackendServers([{"ServerId": instance_id, "Weight": "100", "Type": "ecs", "ServerIp": ipaddr}])
|
|
|
+ response = client.do_action_with_exception(request)
|
|
|
+ logging.info(response)
|
|
|
+
|
|
|
+def getIpaddr(instance_id):
|
|
|
+ request = DescribeNetworkInterfacesRequest()
|
|
|
+ request.set_accept_format('json')
|
|
|
+ request.set_InstanceId(instance_id)
|
|
|
+ response = clt.do_action_with_exception(request)
|
|
|
+ request_content = json.loads(response)
|
|
|
+ ipaddr = request_content['NetworkInterfaceSets']['NetworkInterfaceSet'][0]['PrivateIpAddress']
|
|
|
+ return ipaddr
|
|
|
+
|
|
|
+def healthCheck(instance_id):
|
|
|
+ ipaddr = getIpaddr(instance_id)
|
|
|
+ while True:
|
|
|
+ health_url = 'http://%s:8182/longvideoapi/test' %(ipaddr)
|
|
|
+ http_code = requests.get(health_url).status_code
|
|
|
+ if http_code == 200:
|
|
|
+ break
|
|
|
+ else:
|
|
|
+ time.sleep(10)
|
|
|
+ addBackendServers(slb_id,instance_id)
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+# 创建ECS实例并启动。
|
|
|
+def create_multiple_instances():
|
|
|
+ request = build_request()
|
|
|
+ request.set_Amount(amount)
|
|
|
+ _execute_request(request)
|
|
|
+
|
|
|
+
|
|
|
+def _execute_request(request):
|
|
|
+ response = _send_request(request)
|
|
|
+ if response.get('Code') is None:
|
|
|
+ instance_ids = response.get('InstanceIdSets').get('InstanceIdSet')
|
|
|
+ running_amount = 0
|
|
|
+ while running_amount < amount:
|
|
|
+ time.sleep(10)
|
|
|
+ running_amount = check_instance_running(instance_ids)
|
|
|
+
|
|
|
+
|
|
|
+ print(" %s is running" %(instance_ids))
|
|
|
+ time.sleep(60)
|
|
|
+ runCommand(instance_ids)
|
|
|
+ for instance_id in instance_ids:
|
|
|
+ healthCheck(instance_id)
|
|
|
+
|
|
|
+
|
|
|
+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') == "Running":
|
|
|
+ running_count += 1
|
|
|
+ return running_count
|
|
|
+#购买服务器参数配置
|
|
|
+def build_request():
|
|
|
+ request = RunInstancesRequest()
|
|
|
+ request.set_ImageId(image_id)
|
|
|
+ request.set_VSwitchId(vswitch_id)
|
|
|
+ request.set_SecurityGroupId(security_group_id)
|
|
|
+ request.set_ZoneId(zone_id)
|
|
|
+ request.set_InstanceType(instance_type)
|
|
|
+ # request.set_UserData(init_data)
|
|
|
+ request.set_InstanceName(instance_name)
|
|
|
+ request.set_SystemDiskSize(disk_size)
|
|
|
+ request.set_SystemDiskCategory(disk_category)
|
|
|
+ request.set_KeyPairName(key_pair_name)
|
|
|
+ request.set_Tags([
|
|
|
+ {
|
|
|
+ "Key": "ecs",
|
|
|
+ "Value": "clipapi.prod"
|
|
|
+ }
|
|
|
+ ])
|
|
|
+ return request
|
|
|
+
|
|
|
+#批量执行shell脚本
|
|
|
+def runCommand(instance_ids):
|
|
|
+ request = RunCommandRequest()
|
|
|
+ request.set_accept_format('json')
|
|
|
+
|
|
|
+ request.set_Type("RunShellScript")
|
|
|
+ request.set_CommandContent("curl https://rescdn.yishihui.com/crontab/start-clipapi.sh|sh")
|
|
|
+ request.set_InstanceIds(instance_ids)
|
|
|
+
|
|
|
+ response = clt.do_action_with_exception(request)
|
|
|
+ logging.info(response)
|
|
|
+# 发送API请求
|
|
|
+def _send_request(request):
|
|
|
+ request.set_accept_format('json')
|
|
|
+ try:
|
|
|
+ response_str = clt.do_action(request)
|
|
|
+ logging.info(response_str)
|
|
|
+ response_detail = json.loads(response_str)
|
|
|
+ return response_detail
|
|
|
+ except Exception as e:
|
|
|
+ logging.error(e)
|
|
|
+
|
|
|
+if __name__ == '__main__':
|
|
|
+ print ("Start Create Instances")
|
|
|
+ # 创建ECS实例并启动。
|
|
|
+ create_multiple_instances()
|
|
|
+
|
|
|
+
|
|
|
+
|