Bläddra i källkod

update scripts

heyudev 2 år sedan
förälder
incheckning
786ef59a01
3 ändrade filer med 185 tillägg och 0 borttagningar
  1. 11 0
      longvideoapi/README.md
  2. 4 0
      longvideoapi/client/start.sh
  3. 170 0
      longvideoapi/server/ess-instance-vlogapi.py

+ 11 - 0
longvideoapi/README.md

@@ -0,0 +1,11 @@
+longvideoapi 扩容:
+ess-instance-vlogapi.py
+当前流程
+- 批量创建机器
+- 检测机器是否运行
+- 批量启动docker容器
+- 探活
+- 配置权重
+
+TODO
+- 异步并发处理

+ 4 - 0
longvideoapi/client/start.sh

@@ -0,0 +1,4 @@
+#/bin/bash
+
+docker login --username=stuuudys --password=Qingqu@2019   registry-vpc.cn-hangzhou.aliyuncs.com
+docker run --cap-add=SYS_PTRACE  -d -it   --name  vlogapi   --restart=always --network host    registry-vpc.cn-hangzhou.aliyuncs.com/stuuudy/vlogapi:latest

+ 170 - 0
longvideoapi/server/ess-instance-vlogapi.py

@@ -0,0 +1,170 @@
+# #!/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"
+image_id = "m-bp12bkuvg20k6ueqmb4v"
+security_group_id = "sg-bp1irhrkr4vfj272hk4y"
+amount = int(sys.argv[1])
+AccessKey = 'LTAIuPbTPL3LDDKN'
+AccessSecret = 'ORcNedKwWuwVtcq4IRFtUDZgS0b1le'
+RegionId = 'cn-hangzhou'
+disk_size = "200"
+instance_name = "ESS-vlogapi-[1,2]"
+zone_id = "cn-hangzhou-h"
+disk_category = "cloud_efficiency"
+key_pair_name = "stuuudy"
+#slb_id = "lb-bp1r9duz4k7z0riz9zs3n"
+#vlogapi
+slb_id_2 = "lb-bp1qk9mkvjtundlzz7owm"
+slb_id_3 = "lb-bp1akia6vlguiwg4znaq8"
+slb_id_4 = "lb-bp1pj2v06ladvgftgxcp0"
+
+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)
+  time.sleep(300)
+#  addBackendServers(slb_id_1,instance_id)
+  addBackendServers(slb_id_2,instance_id)
+  addBackendServers(slb_id_3,instance_id)
+  addBackendServers(slb_id_4,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": "vlogapi.prod"
+      }
+    ])
+    return request
+
+#批量执行shell脚本
+def  runCommand(instance_ids):
+  request = RunCommandRequest()
+  request.set_accept_format('json')
+
+  request.set_Type("RunShellScript")
+  request.set_CommandContent("sh /home/sh/start.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()