ess-instance-vlogapi.py 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. # #!/usr/bin/env python
  2. # #coding=utf-8
  3. #
  4. import json
  5. import logging
  6. import time
  7. import requests
  8. import sys
  9. from aliyunsdkcore import client
  10. from aliyunsdkcore.client import AcsClient
  11. from aliyunsdkcore.acs_exception.exceptions import ClientException
  12. from aliyunsdkcore.acs_exception.exceptions import ServerException
  13. from aliyunsdkcore.request import CommonRequest
  14. from aliyunsdkecs.request.v20140526.CreateInstanceRequest import CreateInstanceRequest
  15. from aliyunsdkecs.request.v20140526.StartInstanceRequest import StartInstanceRequest
  16. from aliyunsdkecs.request.v20140526.DescribeInstancesRequest import DescribeInstancesRequest
  17. from aliyunsdkecs.request.v20140526.RunInstancesRequest import RunInstancesRequest
  18. from aliyunsdkecs.request.v20140526.DescribeNetworkInterfacesRequest import DescribeNetworkInterfacesRequest
  19. from aliyunsdkslb.request.v20140515.AddBackendServersRequest import AddBackendServersRequest
  20. from aliyunsdkecs.request.v20140526.RunCommandRequest import RunCommandRequest
  21. logging.basicConfig(level=logging.INFO,
  22. format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
  23. datefmt='%a, %d %b %Y %H:%M:%S')
  24. ak_id = "LTAI4GBWbFvvXoXsSVBe1o9f"
  25. ak_secret = "kRAikWitb4kDxaAyBqNrmLmllMEDO3"
  26. region_id = "cn-hangzhou"
  27. clt = client.AcsClient(ak_id, ak_secret, region_id)
  28. instance_type = "ecs.c6.2xlarge"
  29. vswitch_id = "vsw-bp19lpjwtc6j0p0m9mdc2"
  30. #image_id = "m-bp15xqcuacm4zw2h2gi6"
  31. image_id = "m-bp12bkuvg20k6ueqmb4v"
  32. security_group_id = "sg-bp1irhrkr4vfj272hk4y"
  33. amount = int(sys.argv[1])
  34. AccessKey = 'LTAIuPbTPL3LDDKN'
  35. AccessSecret = 'ORcNedKwWuwVtcq4IRFtUDZgS0b1le'
  36. RegionId = 'cn-hangzhou'
  37. disk_size = "200"
  38. instance_name = "ESS-vlogapi-[1,2]"
  39. zone_id = "cn-hangzhou-h"
  40. disk_category = "cloud_efficiency"
  41. key_pair_name = "stuuudy"
  42. #slb_id = "lb-bp1r9duz4k7z0riz9zs3n"
  43. #vlogapi
  44. slb_id_2 = "lb-bp1qk9mkvjtundlzz7owm"
  45. # slb_id_3 = "lb-bp1akia6vlguiwg4znaq8"
  46. slb_id_4 = "lb-bp1pj2v06ladvgftgxcp0"
  47. slb_id_5 = "lb-bp1y63rnrb2e64whryghz"
  48. client = AcsClient (AccessKey, AccessSecret, RegionId)
  49. def addBackendServers(slb_id,instance_id):
  50. request = AddBackendServersRequest()
  51. request.set_accept_format('json')
  52. ipaddr = getIpaddr(instance_id)
  53. request.set_LoadBalancerId(slb_id)
  54. request.set_BackendServers([{"ServerId": instance_id, "Weight": "0", "Type": "ecs", "ServerIp": ipaddr}])
  55. response = client.do_action_with_exception(request)
  56. logging.info(response)
  57. def getIpaddr(instance_id):
  58. request = DescribeNetworkInterfacesRequest()
  59. request.set_accept_format('json')
  60. request.set_InstanceId(instance_id)
  61. response = clt.do_action_with_exception(request)
  62. request_content = json.loads(response)
  63. ipaddr = request_content['NetworkInterfaceSets']['NetworkInterfaceSet'][0]['PrivateIpAddress']
  64. return ipaddr
  65. def healthCheck(instance_id):
  66. ipaddr = getIpaddr(instance_id)
  67. while True:
  68. health_url = 'http://%s:8182/longvideoapi/test' %(ipaddr)
  69. http_code = requests.get(health_url).status_code
  70. if http_code == 200:
  71. break
  72. else:
  73. time.sleep(10)
  74. time.sleep(300)
  75. # addBackendServers(slb_id_1,instance_id)
  76. addBackendServers(slb_id_2,instance_id)
  77. # addBackendServers(slb_id_3,instance_id)
  78. addBackendServers(slb_id_4,instance_id)
  79. addBackendServers(slb_id_5,instance_id)
  80. for i in range(1, 6):
  81. time.sleep(5)
  82. weight = i * 20
  83. logging.info(f"instance_id: {instance_id}, weight: {weight}")
  84. setWeight(slb_id=slb_id_2, instance_id=instance_id, weight=weight)
  85. setWeight(slb_id=slb_id_4, instance_id=instance_id, weight=weight)
  86. setWeight(slb_id=slb_id_5, instance_id=instance_id, weight=weight)
  87. #设置权重 instance_id :服务器id,weight:权重值
  88. def setWeight(slb_id,instance_id ,weight):
  89. BackendServers = [{"ServerId": instance_id, "Weight": weight}]
  90. request = CommonRequest()
  91. request.set_accept_format ('json')
  92. request.set_domain ('slb.aliyuncs.com')
  93. request.set_version ('2014-05-15')
  94. request.set_method ('POST')
  95. request.set_action_name ('SetBackendServers')
  96. request.add_query_param ('BackendServers', BackendServers)
  97. request.add_query_param ('LoadBalancerId', slb_id)
  98. try:
  99. response = clt.do_action (request)
  100. except Exception as e:
  101. print (e)
  102. # 创建ECS实例并启动。
  103. def create_multiple_instances():
  104. request = build_request()
  105. request.set_Amount(amount)
  106. _execute_request(request)
  107. def _execute_request(request):
  108. response = _send_request(request)
  109. if response.get('Code') is None:
  110. instance_ids = response.get('InstanceIdSets').get('InstanceIdSet')
  111. running_amount = 0
  112. while running_amount < amount:
  113. time.sleep(10)
  114. running_amount = check_instance_running(instance_ids)
  115. print(" %s is running" %(instance_ids))
  116. time.sleep(60)
  117. runCommand(instance_ids)
  118. for instance_id in instance_ids:
  119. healthCheck(instance_id)
  120. def check_instance_running(instance_ids):
  121. request = DescribeInstancesRequest()
  122. request.set_InstanceIds(json.dumps(instance_ids))
  123. response = _send_request(request)
  124. if response.get('Code') is None:
  125. instances_list = response.get('Instances').get('Instance')
  126. running_count = 0
  127. for instance_detail in instances_list:
  128. if instance_detail.get('Status') == "Running":
  129. running_count += 1
  130. return running_count
  131. #购买服务器参数配置
  132. def build_request():
  133. request = RunInstancesRequest()
  134. request.set_ImageId(image_id)
  135. request.set_VSwitchId(vswitch_id)
  136. request.set_SecurityGroupId(security_group_id)
  137. request.set_ZoneId(zone_id)
  138. request.set_InstanceType(instance_type)
  139. # request.set_UserData(init_data)
  140. request.set_InstanceName(instance_name)
  141. request.set_SystemDiskSize(disk_size)
  142. request.set_SystemDiskCategory(disk_category)
  143. request.set_KeyPairName(key_pair_name)
  144. request.set_Tags([
  145. {
  146. "Key": "ecs",
  147. "Value": "longvideoapi.prod"
  148. }
  149. ])
  150. return request
  151. #批量执行shell脚本
  152. def runCommand(instance_ids):
  153. request = RunCommandRequest()
  154. request.set_accept_format('json')
  155. request.set_Type("RunShellScript")
  156. request.set_CommandContent("sh /home/sh/start.sh")
  157. request.set_InstanceIds(instance_ids)
  158. response = clt.do_action_with_exception(request)
  159. logging.info(response)
  160. # 发送API请求
  161. def _send_request(request):
  162. request.set_accept_format('json')
  163. try:
  164. response_str = clt.do_action(request)
  165. logging.info(response_str)
  166. response_detail = json.loads(response_str)
  167. return response_detail
  168. except Exception as e:
  169. logging.error(e)
  170. if __name__ == '__main__':
  171. print ("Start Create Instances")
  172. # 创建ECS实例并启动。
  173. create_multiple_instances()