liqian 2 роки тому
батько
коміт
1afad59806
3 змінених файлів з 132 додано та 15 видалено
  1. 3 0
      rov_server_start.sh
  2. 97 0
      rov_server_update.py
  3. 32 15
      utils.py

+ 3 - 0
rov_server_start.sh

@@ -0,0 +1,3 @@
+#!/bin/bash
+docker login --username=admin --password=Harbor12345 registry.piaoquantv.com
+docker run -d -it --network=host --name=rov-server registry.piaoquantv.com/piaoquan/rov-server:latest

+ 97 - 0
rov_server_update.py

@@ -0,0 +1,97 @@
+import time
+
+import utils
+import logging
+import os
+
+slb_id = 'lb-bp1werfophtsjzfr76njm'
+# 修改负载均衡权限
+slb_client_params = {
+    'access_key_id': 'LTAIuPbTPL3LDDKN',
+    'access_key_secret': 'ORcNedKwWuwVtcq4IRFtUDZgS0b1le',
+    'region_id': 'cn-hangzhou'
+}
+# 购买机器权限
+create_client_params = {
+    'access_key_id': 'LTAI4GBWbFvvXoXsSVBe1o9f',
+    'access_key_secret': 'kRAikWitb4kDxaAyBqNrmLmllMEDO3',
+    'region_id': 'cn-hangzhou'
+}
+
+# 机器配置
+instance_config = {
+    # 使用的镜像信息
+    'image_id': 'm-bp1e5jx8eqhq22l91xw7',
+    # 设置实例规格
+    'instance_type': 'ecs.ic5.xlarge',
+    # 选择的交换机
+    'vswitch_id': 'vsw-bp19lpjwtc6j0p0m9mdc2',
+    # 当前VPC类型的安全组
+    'security_group_id': 'sg-bp1irhrkr4vfj272hk4y',
+    # 硬盘的大小,单位:G
+    'disk_size': '200',
+    # 服务器命名
+    'instance_name': 'ESS-rov-server-[1,2]',
+    # 服务器所在区域
+    'zone_id': 'cn-hangzhou-h',
+    # 磁盘类型:云盘
+    'disk_category': 'cloud_efficiency',
+    # 密钥
+    'key_pair_name': 'stuuudy'
+}
+
+# 服务启动脚本
+start_sh_dir = os.path.dirname(os.path.realpath(__file__))
+start_sh_filename = 'rov_server_start.sh'
+with open(file=os.path.join(start_sh_dir, start_sh_filename), mode='r', encoding='utf-8') as rf:
+    file_content = rf.read()
+start_sh = {
+    'target_dir': '/home/piaoquan_server_sh',
+    'name': start_sh_filename,
+    'content': file_content,
+}
+
+
+def ess_instance(create_client, slb_client, ess_count):
+    """
+    扩容机器并运行新服务
+    :param create_client: 购买机器客户端连接
+    :param slb_client: 修改负载均衡权限
+    :param ess_count: 扩容数量
+    :return:
+    """
+    # 1. 购买机器并启动
+    ess_instance_ids = utils.create_multiple_instances(
+        amount=ess_count,
+        client=create_client,
+        **instance_config,
+    )
+    time.sleep(60)
+    # 2. 发送启动脚本到机器上
+    utils.send_file_to_ecs(client=create_client, instance_id_list=ess_instance_ids, **start_sh)
+    # 3. 启动服务
+    server_start_sh = os.path.join(start_sh['target_dir'], start_sh['name'])
+    server_start_commend = f"sh {server_start_sh}"
+    utils.run_command(client=create_client, instance_ids=ess_instance_ids, command=server_start_commend)
+
+
+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'],
+                                      region_id=slb_client_params['region_id'])
+    create_client = utils.connect_client(access_key_id=create_client_params['access_key_id'],
+                                         access_key_secret=create_client_params['access_key_secret'],
+                                         region_id=create_client_params['region_id'])
+
+    # 1. 获取slb下所有机器
+    online_instance_ids = utils.get_instance_ids(client=slb_client, slb_id=slb_id)
+    online_instance_count = len(online_instance_ids)
+    logging.info(f"online instance count: {online_instance_count}.")
+    logging.info(f"online instance ids: {online_instance_ids}")
+
+    # 2. 扩容机器并启动新服务 扩容数量:线上机器数量/2
+    ess_instance_count = online_instance_count / 2
+    logging.info(f"ess instance count: {ess_instance_count}")
+
+
+

+ 32 - 15
utils.py

@@ -10,6 +10,7 @@ from aliyunsdkecs.request.v20140526.DescribeInstancesRequest import DescribeInst
 from aliyunsdkecs.request.v20140526.DescribeNetworkInterfacesRequest import DescribeNetworkInterfacesRequest
 from aliyunsdkslb.request.v20140515.DescribeLoadBalancerAttributeRequest import DescribeLoadBalancerAttributeRequest
 from aliyunsdkecs.request.v20140526.RunCommandRequest import RunCommandRequest
+from aliyunsdkecs.request.v20140526.SendFileRequest import SendFileRequest
 from aliyunsdkcore.request import CommonRequest
 
 logging.basicConfig(level=logging.INFO,
@@ -126,16 +127,13 @@ def check_instance_running(client, instance_ids):
         sys.exit()
 
 
-def create_multiple_instances(amount,
-                              access_key_id, access_key_secret, region_id,
+def create_multiple_instances(amount, client,
                               image_id, vswitch_id, security_group_id, zone_id, instance_type, instance_name,
                               disk_size, disk_category, key_pair_name, tags):
     """
     创建多个ECS实例
     :param amount: 创建实例数 type-int 取值范围:[1, 100]
-    :param access_key_id: access key Id, type-string
-    :param access_key_secret: access key secret, type-string
-    :param region_id: region_id, type-string
+    :param client: 购买机器客户端连接
     :param image_id: 使用的镜像信息 type-string
     :param vswitch_id: 选择的交换机 type-string
     :param security_group_id: 当前vpc类型的安全组 type-string
@@ -150,9 +148,9 @@ def create_multiple_instances(amount,
     """
     logging.info(f"create instances start, request amount: {amount}.")
     # 1. 连接客户端
-    create_instances_clt = connect_client(
-        access_key_id=access_key_id, access_key_secret=access_key_secret, region_id=region_id
-    )
+    # create_instances_clt = connect_client(
+    #     access_key_id=access_key_id, access_key_secret=access_key_secret, region_id=region_id
+    # )
     # 2. 请求参数配置
     request = build_create_instances_request(
         image_id=image_id, vswitch_id=vswitch_id, security_group_id=security_group_id, zone_id=zone_id,
@@ -161,7 +159,7 @@ def create_multiple_instances(amount,
     )
     request.set_Amount(amount)
     # 3. 发送API请求,购买机器并启动
-    response = send_request(client=create_instances_clt, request=request)
+    response = send_request(client=client, request=request)
     if response.get('Code') is None:
         instance_ids = response.get('InstanceIdSets').get('InstanceIdSet')
         logging.info(f"success amount: {len(instance_ids)}, instance ids: {instance_ids}.")
@@ -169,8 +167,7 @@ def create_multiple_instances(amount,
         running_amount = 0
         while running_amount < amount:
             time.sleep(10)
-            running_amount, running_instances = check_instance_running(client=create_instances_clt,
-                                                                       instance_ids=instance_ids)
+            running_amount, running_instances = check_instance_running(client=client, instance_ids=instance_ids)
             logging.info(f"running amount: {running_amount}, running instances: {running_instances}.")
         return instance_ids
     else:
@@ -196,18 +193,19 @@ def run_command(client, instance_ids, command):
     logging.info(response)
 
 
-def get_instances(client, slb_id):
+def get_instance_ids(client, slb_id):
     """
-    获取slb下所有服务器信息
+    获取slb下所有服务器instanceId
     :param client: 客户端连接
     :param slb_id: 负载均衡id type-string
-    :return:
+    :return: instance_ids type-list
     """
     request = DescribeLoadBalancerAttributeRequest()
     request.set_accept_format('json')
     request.set_LoadBalancerId(slb_id)
     response = send_request(client=client, request=request)
-    return response
+    instance_ids = [instance["ServerId"] for instance in response["BackendServers"]["BackendServer"]]
+    return instance_ids
 
 
 def get_ip_address(client, instance_id):
@@ -245,3 +243,22 @@ def set_weight_for_instances(client, slb_id, instance_id_list, weight):
     request.add_query_param('LoadBalancerId', slb_id)
     response = send_request(client=client, request=request)
     return response
+
+
+def send_file_to_ecs(client, instance_id_list, target_dir, name, content):
+    """
+    发送文件到ecs
+    :param client:
+    :param instance_id_list:
+    :param target_dir: 文件存放目录 type-string
+    :param name: 文件名 type-string
+    :param content: 文件内容 type-string
+    :return:
+    """
+    request = SendFileRequest()
+    request.set_Content(content)
+    request.set_TargetDir(target_dir)
+    request.set_Name(name)
+    request.set_Overwrite(True)
+    request.set_InstanceIds(instance_id_list)
+    response = send_request(client=client, request=request)