liqian 2 年 前
コミット
d344fdc8c3
2 ファイル変更99 行追加0 行削除
  1. 53 0
      rov_server_update.py
  2. 46 0
      utils.py

+ 53 - 0
rov_server_update.py

@@ -11,6 +11,7 @@ from concurrent.futures import ThreadPoolExecutor
 
 
 health_instances = []
+ess_instances = []
 
 slb_id = 'lb-bp1werfophtsjzfr76njm'
 # 修改负载均衡权限
@@ -180,6 +181,8 @@ async def ess_instance(create_client, slb_client, ess_count, max_workers):
         time.sleep(60)
         add_weight_list = [(10, 30), (20, 20), (40, 10), (60, 10), (80, 10), (100, 10)]
         set_instance_weight_process(client=slb_client, instance_id_list=ess_instance_ids, weight_list=add_weight_list)
+        global ess_instances
+        ess_instances.extend(ess_instance_ids)
         logging.info(f"ess count: {ess_count}, "
                      f"create count: {len(ess_instance_ids)}, "
                      f"finished count: {len(health_instances)}")
@@ -282,6 +285,44 @@ async def update_instance(create_client, slb_client, instance_ids, max_workers):
             sys.exit()
 
 
+def remove_instances(create_client, slb_client, instance_ids):
+    """
+    停止并释放机器
+    :param create_client:
+    :param slb_client:
+    :param instance_ids: instanceId type-list
+    :return: None
+    """
+    # 1. 摘流量
+    set_instance_weight_process(client=slb_client, instance_id_list=instance_ids, weight_list=[(0, 60)])
+    logging.info(f"set weight = 0 finished, instances: {instance_ids}")
+    time.sleep(10)
+    # 2. 停止机器
+    utils.stop_instances(client=create_client, instance_ids=instance_ids)
+    logging.info(f"instances stop finished, instances: {instance_ids}")
+    # 3. 判断机器运行状态是否为Stopped
+    response = utils.get_instances_status(client=create_client, instance_ids=instance_ids)
+    if response.get('Code') is None:
+        instances_list = response.get('InstanceStatuses').get('InstanceStatus')
+        stopped_instances = [instance.get('InstanceId') for instance in instances_list
+                             if instance.get('Status') == 'Stopped']
+        if len(stopped_instances) == len(instance_ids):
+            logging.info(f"instances stopped status set success, instances: {stopped_instances}")
+        else:
+            logging.info(f"stopped instances count = {len(instance_ids)}, instances: {stopped_instances}")
+            sys.exit()
+    else:
+        logging.error(response)
+        sys.exit()
+    # 4. 释放机器
+    response = utils.release_instances(client=create_client, instance_ids=stopped_instances)
+    if response.get('Code') is None:
+        logging.info(f"release instances finished, instances: {stopped_instances}")
+    else:
+        logging.error(f"release instances fail!!!")
+        sys.exit()
+
+
 def main():
     slb_client = utils.connect_client(access_key_id=slb_client_params['access_key_id'],
                                       access_key_secret=slb_client_params['access_key_secret'],
@@ -297,9 +338,21 @@ def main():
     logging.info(f"online instance ids: {online_instance_ids}")
 
     # 2. 扩容机器并启动新服务 扩容数量:线上机器数量/2
+    logging.info(f"ess instances start ...")
     ess_instance_count = online_instance_count / 2
     logging.info(f"ess instance count: {ess_instance_count}")
     asyncio.run(ess_instance(create_client=create_client, slb_client=slb_client,
                              ess_count=ess_instance_count, max_workers=2))
+    logging.info(f"ess instances end!")
 
     # 3. 原有机器进行更新
+    logging.info(f"update online instances start ...")
+    asyncio.run(update_instance(create_client=create_client, slb_client=slb_client,
+                                instance_ids=online_instance_ids, max_workers=2))
+    logging.info(f"update online instances end!")
+
+    # 4. 停止并释放扩容机器
+    logging.info(f"stop & release instances start ...")
+    remove_instances(create_client=create_client, slb_client=slb_client, instance_ids=ess_instances)
+    logging.info(f"stop & release instances end!")
+

+ 46 - 0
utils.py

@@ -11,6 +11,9 @@ from aliyunsdkecs.request.v20140526.DescribeNetworkInterfacesRequest import Desc
 from aliyunsdkslb.request.v20140515.DescribeLoadBalancerAttributeRequest import DescribeLoadBalancerAttributeRequest
 from aliyunsdkecs.request.v20140526.RunCommandRequest import RunCommandRequest
 from aliyunsdkecs.request.v20140526.SendFileRequest import SendFileRequest
+from aliyunsdkecs.request.v20140526.StopInstancesRequest import StopInstancesRequest
+from aliyunsdkecs.request.v20140526.DeleteInstancesRequest import DeleteInstancesRequest
+from aliyunsdkecs.request.v20140526.DescribeInstanceStatusRequest import DescribeInstanceStatusRequest
 from aliyunsdkcore.request import CommonRequest
 
 logging.basicConfig(level=logging.INFO,
@@ -263,3 +266,46 @@ def send_file_to_ecs(client, instance_id_list, target_dir, name, content):
     request.set_InstanceIds(instance_id_list)
     response = send_request(client=client, request=request)
     return response
+
+
+def stop_instances(client, instance_ids, force_stop=False):
+    """
+    停止实例
+    :param client:
+    :param instance_ids: 实例ID, type-list
+    :param force_stop: 是否强制关机, True-强制关机, False-正常关机, type-bool
+    :return:
+    """
+    request = StopInstancesRequest()
+    request.set_InstanceIds(instance_ids)
+    request.set_ForceStop(force_stop)
+    response = send_request(client=client, request=request)
+    return response
+
+
+def release_instances(client, instance_ids, force=False):
+    """
+    释放实例
+    :param client:
+    :param instance_ids: instance_id, type-list
+    :param force: 是否强制释放, True-强制释放, False-正常释放, type-bool
+    :return:
+    """
+    request = DeleteInstancesRequest()
+    request.set_InstanceIds(instance_ids)
+    request.set_Force(force)
+    response = send_request(client=client, request=request)
+    return response
+
+
+def get_instances_status(client, instance_ids):
+    """
+    获取实例运行状态
+    :param client:
+    :param instance_ids: instance_id, type-liist
+    :return:
+    """
+    request = DescribeInstanceStatusRequest()
+    request.set_InstanceIds(instance_ids)
+    response = send_request(client=client, request=request)
+    return response