|
@@ -77,9 +77,6 @@ def connect_alb_client(access_key_id, access_key_secret, endpoint):
|
|
|
return alb_client
|
|
|
|
|
|
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
def build_create_instances_request(image_id, vswitch_id, security_group_id, zone_id, instance_type, instance_name,
|
|
|
disk_size, disk_category, key_pair_name, tags):
|
|
|
"""
|
|
@@ -119,16 +116,16 @@ def send_req(client, request):
|
|
|
"""
|
|
|
request.set_accept_format('json')
|
|
|
response = client.do_action_with_exception(request)
|
|
|
- #print(response)
|
|
|
+ # print(response)
|
|
|
response = json.loads(response)
|
|
|
print(response)
|
|
|
- # logging.info(response)
|
|
|
+ # logging.info(response)
|
|
|
print(response.get('Code'))
|
|
|
return response
|
|
|
- #except Exception as e:
|
|
|
- # 失败,记录报错信息,发送通知,停止并退出
|
|
|
- #logging.error(e)
|
|
|
- #sys.exit()
|
|
|
+ # except Exception as e:
|
|
|
+ # 失败,记录报错信息,发送通知,停止并退出
|
|
|
+ # logging.error(e)
|
|
|
+ # sys.exit()
|
|
|
|
|
|
|
|
|
def check_instance_running(ecs_client, instance_ids):
|
|
@@ -177,7 +174,6 @@ def get_ip_address(ecs_client, instance_id):
|
|
|
return ip_address
|
|
|
|
|
|
|
|
|
-
|
|
|
def create_multiple_instances(amount, ecs_client,
|
|
|
image_id, vswitch_id, security_group_id, zone_id, instance_type, instance_name,
|
|
|
disk_size, disk_category, key_pair_name, tags):
|
|
@@ -203,29 +199,43 @@ def create_multiple_instances(amount, ecs_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,
|
|
|
- instance_type=instance_type, instance_name=instance_name, disk_size=disk_size, disk_category=disk_category,
|
|
|
- key_pair_name=key_pair_name, tags=tags
|
|
|
- )
|
|
|
- request.set_Amount(amount)
|
|
|
- # 3. 发送API请求,购买机器并启动
|
|
|
- response = send_request(ecs_client=ecs_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}.")
|
|
|
- # 获取机器运行状态
|
|
|
- running_amount = 0
|
|
|
- while running_amount < amount:
|
|
|
- time.sleep(10)
|
|
|
- running_amount, running_instances = check_instance_running(ecs_client=ecs_client, instance_ids=instance_ids)
|
|
|
- logging.info(f"running amount: {running_amount}, running instances: {running_instances}.")
|
|
|
- return instance_ids
|
|
|
- else:
|
|
|
- # 失败,记录报错信息,发送通知,停止并退出
|
|
|
- logging.error(response)
|
|
|
- sys.exit()
|
|
|
-
|
|
|
+ instance_ids = []
|
|
|
+
|
|
|
+ while True:
|
|
|
+ if amount <= 0:
|
|
|
+ break
|
|
|
+ sub_amount = 0
|
|
|
+ if amount > 100:
|
|
|
+ sub_amount = 100
|
|
|
+ amount = amount - sub_amount
|
|
|
+ else:
|
|
|
+ sub_amount = amount
|
|
|
+ amount = 0
|
|
|
+ request = build_create_instances_request(
|
|
|
+ image_id=image_id, vswitch_id=vswitch_id, security_group_id=security_group_id, zone_id=zone_id,
|
|
|
+ instance_type=instance_type, instance_name=instance_name, disk_size=disk_size, disk_category=disk_category,
|
|
|
+ key_pair_name=key_pair_name, tags=tags
|
|
|
+ )
|
|
|
+ request.set_Amount(sub_amount)
|
|
|
+ # 3. 发送API请求,购买机器并启动
|
|
|
+ response = send_request(ecs_client=ecs_client, request=request)
|
|
|
+ if response.get('Code') is None:
|
|
|
+ sub_instance_ids = response.get('InstanceIdSets').get('InstanceIdSet')
|
|
|
+ logging.info(f"success amount: {len(sub_instance_ids)}, instance ids: {sub_instance_ids}.")
|
|
|
+ # 获取机器运行状态
|
|
|
+ running_amount = 0
|
|
|
+ while running_amount < sub_amount:
|
|
|
+ time.sleep(10)
|
|
|
+ running_amount, running_instances = check_instance_running(ecs_client=ecs_client,
|
|
|
+ instance_ids=sub_instance_ids)
|
|
|
+ logging.info(f"running amount: {running_amount}, running instances: {running_instances}.")
|
|
|
+ # return instance_ids
|
|
|
+ instance_ids.extend(sub_instance_ids)
|
|
|
+ else:
|
|
|
+ # 失败,记录报错信息,发送通知,停止并退出
|
|
|
+ logging.error(response)
|
|
|
+ sys.exit()
|
|
|
+ return instance_ids
|
|
|
|
|
|
|
|
|
def release_instances(ecs_client, instance_ids, force=False):
|
|
@@ -236,12 +246,18 @@ def release_instances(ecs_client, instance_ids, force=False):
|
|
|
:param force: 是否强制释放, True-强制释放, False-正常释放, type-bool
|
|
|
:return:
|
|
|
"""
|
|
|
- request = DeleteInstancesRequest()
|
|
|
- request.set_InstanceIds(instance_ids)
|
|
|
- request.set_Force(force)
|
|
|
- response = send_request(ecs_client=ecs_client, request=request)
|
|
|
- return response
|
|
|
-
|
|
|
+ instance_id_list_array = [instance_ids[i:i + 100] for i in range(0, len(instance_ids), 100)]
|
|
|
+ for instance_id_sub_array in instance_id_list_array:
|
|
|
+ request = DeleteInstancesRequest()
|
|
|
+ request.set_InstanceIds(instance_id_sub_array)
|
|
|
+ request.set_Force(force)
|
|
|
+ response = send_request(ecs_client=ecs_client, request=request)
|
|
|
+ # return response
|
|
|
+ if response.get('Code') is None:
|
|
|
+ logging.info(f"Release instances finished, instances: {instance_id_sub_array}")
|
|
|
+ else:
|
|
|
+ logging.error(f"Release instances fail!!!")
|
|
|
+ sys.exit()
|
|
|
|
|
|
|
|
|
def get_instances_status(ecs_client, instance_ids):
|
|
@@ -251,12 +267,26 @@ def get_instances_status(ecs_client, instance_ids):
|
|
|
:param instance_ids: instance_id, type-list
|
|
|
:return:
|
|
|
"""
|
|
|
- request = DescribeInstanceStatusRequest()
|
|
|
- request.set_InstanceIds(instance_ids)
|
|
|
- request.set_PageSize(50)
|
|
|
- response = send_request(ecs_client=ecs_client, request=request)
|
|
|
- return response
|
|
|
-
|
|
|
+ instance_id_list_array = [instance_ids[i:i + 100] for i in range(0, len(instance_ids), 100)]
|
|
|
+ for instance_id_sub_array in instance_id_list_array:
|
|
|
+ request = DescribeInstanceStatusRequest()
|
|
|
+ request.set_InstanceIds(instance_id_sub_array)
|
|
|
+ request.set_PageSize(50)
|
|
|
+ response = send_request(ecs_client=ecs_client, request=request)
|
|
|
+ # return response
|
|
|
+ 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_id_sub_array):
|
|
|
+ logging.info(f"Instances stopped status set success, instances: {stopped_instances}")
|
|
|
+ break
|
|
|
+ else:
|
|
|
+ logging.info(f"Stopped instances count = {len(stopped_instances)}, instances: {stopped_instances}")
|
|
|
+ time.sleep(5)
|
|
|
+ else:
|
|
|
+ logging.error(response)
|
|
|
+ sys.exit()
|
|
|
|
|
|
|
|
|
def stop_instances(ecs_client, instance_ids, force_stop=False):
|
|
@@ -267,13 +297,18 @@ def stop_instances(ecs_client, instance_ids, force_stop=False):
|
|
|
:param force_stop: 是否强制关机, True-强制关机, False-正常关机, type-bool
|
|
|
:return:
|
|
|
"""
|
|
|
- request = StopInstancesRequest()
|
|
|
- request.set_InstanceIds(instance_ids)
|
|
|
- request.set_ForceStop(force_stop)
|
|
|
- response = send_request(ecs_client=ecs_client, request=request)
|
|
|
- return response
|
|
|
-
|
|
|
-
|
|
|
+ instance_id_list_array = [instance_ids[i:i + 100] for i in range(0, len(instance_ids), 100)]
|
|
|
+ for instance_id_sub_array in instance_id_list_array:
|
|
|
+ request = StopInstancesRequest()
|
|
|
+ request.set_InstanceIds(instance_id_sub_array)
|
|
|
+ request.set_ForceStop(force_stop)
|
|
|
+ response = send_request(ecs_client=ecs_client, request=request)
|
|
|
+ # return response
|
|
|
+ if response.get('Code') is None:
|
|
|
+ logging.info(f"Instances stop finished, instances: {instance_id_sub_array}")
|
|
|
+ else:
|
|
|
+ logging.error(f"Failed to stop instances: {response}")
|
|
|
+ sys.exit()
|
|
|
|
|
|
|
|
|
def send_request(ecs_client, request):
|
|
@@ -295,7 +330,6 @@ def send_request(ecs_client, request):
|
|
|
sys.exit()
|
|
|
|
|
|
|
|
|
-
|
|
|
def run_command(ecs_client, instance_ids, command):
|
|
|
"""
|
|
|
批量执行命令
|
|
@@ -350,7 +384,6 @@ def send_file_to_ecs(ecs_client, instance_id_list, target_dir, name, content):
|
|
|
logging.error(f"发送文件到实例 {instance_ids} 失败,错误: {str(e)}")
|
|
|
|
|
|
|
|
|
-
|
|
|
def add_servers_to_server_group(alb_client, server_group_ids, instance_ids, weight, port):
|
|
|
"""
|
|
|
添加服务器到ALB服务器组
|
|
@@ -360,35 +393,37 @@ def add_servers_to_server_group(alb_client, server_group_ids, instance_ids, weig
|
|
|
:param weight: 权重
|
|
|
:param port: 后端服务器使用的端口
|
|
|
"""
|
|
|
- servers = []
|
|
|
- for i in range(len(instance_ids)):
|
|
|
- server = alb_models.AddServersToServerGroupRequestServers(
|
|
|
- server_id=instance_ids[i],
|
|
|
- server_type='ecs',
|
|
|
- weight=weight,
|
|
|
- port=port
|
|
|
- )
|
|
|
- servers.append(server)
|
|
|
-
|
|
|
- # server = alb_models.AddServersToServerGroupRequestServers(
|
|
|
- # server_id=instance_id,
|
|
|
- # server_type='ecs',
|
|
|
- # weight=weight,
|
|
|
- # port=port
|
|
|
- # )
|
|
|
- for server_group_id in server_group_ids:
|
|
|
- request = alb_models.AddServersToServerGroupRequest(
|
|
|
- server_group_id=server_group_id,
|
|
|
- servers=servers
|
|
|
- )
|
|
|
- runtime = util_models.RuntimeOptions()
|
|
|
- try:
|
|
|
- alb_client.add_servers_to_server_group_with_options(request, runtime)
|
|
|
- logging.info(f"Successfully added instance_ids {instance_ids} to server group {server_group_id} with weight {weight}.")
|
|
|
- except Exception as e:
|
|
|
- logging.error(f"Failed to add instance_ids {instance_ids} to server group {server_group_id}: {str(e)}")
|
|
|
- sys.exit()
|
|
|
-
|
|
|
+ instance_ids_array = [instance_ids[i:i + 200] for i in range(0, len(instance_ids), 200)]
|
|
|
+ for instance_ids_sub_array in instance_ids_array:
|
|
|
+ servers = []
|
|
|
+ for i in range(len(instance_ids_sub_array)):
|
|
|
+ server = alb_models.AddServersToServerGroupRequestServers(
|
|
|
+ server_id=instance_ids_sub_array[i],
|
|
|
+ server_type='ecs',
|
|
|
+ weight=weight,
|
|
|
+ port=port
|
|
|
+ )
|
|
|
+ servers.append(server)
|
|
|
+
|
|
|
+ # server = alb_models.AddServersToServerGroupRequestServers(
|
|
|
+ # server_id=instance_id,
|
|
|
+ # server_type='ecs',
|
|
|
+ # weight=weight,
|
|
|
+ # port=port
|
|
|
+ # )
|
|
|
+ for server_group_id in server_group_ids:
|
|
|
+ request = alb_models.AddServersToServerGroupRequest(
|
|
|
+ server_group_id=server_group_id,
|
|
|
+ servers=servers
|
|
|
+ )
|
|
|
+ runtime = util_models.RuntimeOptions()
|
|
|
+ try:
|
|
|
+ alb_client.add_servers_to_server_group_with_options(request, runtime)
|
|
|
+ logging.info(
|
|
|
+ f"Successfully added instance_ids_sub_array {instance_ids_sub_array} to server group {server_group_id} with weight {weight}.")
|
|
|
+ except Exception as e:
|
|
|
+ logging.error(f"Failed to add instance_ids_sub_array {instance_ids_sub_array} to server group {server_group_id}: {str(e)}")
|
|
|
+ sys.exit()
|
|
|
|
|
|
|
|
|
def remove_servers_from_server_group(alb_client, server_group_id_list, instance_ids, port):
|
|
@@ -399,28 +434,28 @@ def remove_servers_from_server_group(alb_client, server_group_id_list, instance_
|
|
|
:param instance_ids: 实例ID list
|
|
|
:param port: 后端服务器使用的端口
|
|
|
"""
|
|
|
- servers = []
|
|
|
- for instance_id in instance_ids:
|
|
|
- server = alb_models.RemoveServersFromServerGroupRequestServers(
|
|
|
- port=port,
|
|
|
- server_id=instance_id,
|
|
|
- server_type='ecs'
|
|
|
- )
|
|
|
- servers.append(server)
|
|
|
- for server_group_id in server_group_id_list:
|
|
|
- request = alb_models.RemoveServersFromServerGroupRequest(
|
|
|
- server_group_id=server_group_id,
|
|
|
- servers=servers
|
|
|
- )
|
|
|
- runtime = util_models.RuntimeOptions()
|
|
|
- try:
|
|
|
- alb_client.remove_servers_from_server_group_with_options(request, runtime)
|
|
|
- logging.info(f"Successfully removed instance_ids {instance_ids} from server group {server_group_id}.")
|
|
|
- except Exception as e:
|
|
|
- logging.error(f"Failed to remove instance_ids {instance_ids} from server group {server_group_id}: {str(e)}")
|
|
|
- sys.exit()
|
|
|
-
|
|
|
-
|
|
|
+ instance_ids_array = [instance_ids[i:i + 200] for i in range(0, len(instance_ids), 200)]
|
|
|
+ for instance_ids_sub_array in instance_ids_array:
|
|
|
+ servers = []
|
|
|
+ for instance_id in instance_ids_sub_array:
|
|
|
+ server = alb_models.RemoveServersFromServerGroupRequestServers(
|
|
|
+ port=port,
|
|
|
+ server_id=instance_id,
|
|
|
+ server_type='ecs'
|
|
|
+ )
|
|
|
+ servers.append(server)
|
|
|
+ for server_group_id in server_group_id_list:
|
|
|
+ request = alb_models.RemoveServersFromServerGroupRequest(
|
|
|
+ server_group_id=server_group_id,
|
|
|
+ servers=servers
|
|
|
+ )
|
|
|
+ runtime = util_models.RuntimeOptions()
|
|
|
+ try:
|
|
|
+ alb_client.remove_servers_from_server_group_with_options(request, runtime)
|
|
|
+ logging.info(f"Successfully removed instance_ids_sub_array {instance_ids_sub_array} from server group {server_group_id}.")
|
|
|
+ except Exception as e:
|
|
|
+ logging.error(f"Failed to remove instance_ids_sub_array {instance_ids_sub_array} from server group {server_group_id}: {str(e)}")
|
|
|
+ sys.exit()
|
|
|
|
|
|
|
|
|
def list_server_group_servers(alb_client, server_group_id):
|
|
@@ -430,20 +465,26 @@ def list_server_group_servers(alb_client, server_group_id):
|
|
|
@param server_group_id: 服务器组ID
|
|
|
@return: 实例ID列表
|
|
|
"""
|
|
|
- list_server_group_servers_request = alb_20200616_models.ListServerGroupServersRequest(
|
|
|
- server_group_id=server_group_id,
|
|
|
- max_results=100
|
|
|
- )
|
|
|
- runtime = util_models.RuntimeOptions()
|
|
|
-
|
|
|
- try:
|
|
|
- response = alb_client.list_server_group_servers_with_options(list_server_group_servers_request, runtime)
|
|
|
- instance_ids = [server.server_id for server in response.body.servers]
|
|
|
- return instance_ids
|
|
|
- except Exception as error:
|
|
|
- print(str(error))
|
|
|
- UtilClient.assert_as_string(str(error))
|
|
|
- return []
|
|
|
+ instance_ids = []
|
|
|
+ next_token = None
|
|
|
+ while True:
|
|
|
+ try:
|
|
|
+ list_server_group_servers_request = alb_20200616_models.ListServerGroupServersRequest(
|
|
|
+ server_group_id=server_group_id,
|
|
|
+ max_results=100,
|
|
|
+ next_token=next_token
|
|
|
+ )
|
|
|
+ runtime = util_models.RuntimeOptions()
|
|
|
+ response = alb_client.list_server_group_servers_with_options(list_server_group_servers_request, runtime)
|
|
|
+ next_token = UtilClient.to_map(response.body).get('NextToken')
|
|
|
+ sub_instance_ids = [server.server_id for server in response.body.servers]
|
|
|
+ if len(sub_instance_ids) > 0:
|
|
|
+ instance_ids.extend(sub_instance_ids)
|
|
|
+ else:
|
|
|
+ break
|
|
|
+ except Exception as error:
|
|
|
+ logging.error(error)
|
|
|
+ return instance_ids
|
|
|
|
|
|
|
|
|
def update_server_group_server_weight(alb_client, server_group_id_list, instance_id_list, weight, port):
|
|
@@ -455,29 +496,33 @@ def update_server_group_server_weight(alb_client, server_group_id_list, instance
|
|
|
:param weight: 权重值
|
|
|
:param port: 后端服务器使用的端口
|
|
|
"""
|
|
|
- servers = []
|
|
|
- for i in range(len(instance_id_list)):
|
|
|
- server = alb_20200616_models.UpdateServerGroupServersAttributeRequestServers(
|
|
|
- server_type='Ecs',
|
|
|
- server_id=instance_id_list[i],
|
|
|
- weight=weight,
|
|
|
- port=port
|
|
|
- )
|
|
|
- servers.append(server)
|
|
|
- for server_group_id in server_group_id_list:
|
|
|
- request = alb_20200616_models.UpdateServerGroupServersAttributeRequest(
|
|
|
- servers=servers,
|
|
|
- server_group_id=server_group_id
|
|
|
- )
|
|
|
- # logging.info(f"servers = {servers}")
|
|
|
- runtime = util_models.RuntimeOptions()
|
|
|
- try:
|
|
|
- # logging.info(f"instance_id_list = {instance_id_list} request = {request}")
|
|
|
- alb_client.update_server_group_servers_attribute_with_options(request, runtime)
|
|
|
- logging.info(f"Successfully updated servers {instance_id_list} in group {server_group_id} to weight {weight}.")
|
|
|
- except Exception as e:
|
|
|
- logging.error(e)
|
|
|
- sys.exit()
|
|
|
+ instance_id_list_array = [instance_id_list[i:i + 40] for i in range(0, len(instance_id_list), 40)]
|
|
|
+ for instance_ids_sub_array in instance_id_list_array:
|
|
|
+ servers = []
|
|
|
+ for i in range(len(instance_ids_sub_array)):
|
|
|
+ server = alb_20200616_models.UpdateServerGroupServersAttributeRequestServers(
|
|
|
+ server_type='Ecs',
|
|
|
+ server_id=instance_ids_sub_array[i],
|
|
|
+ weight=weight,
|
|
|
+ port=port
|
|
|
+ )
|
|
|
+ servers.append(server)
|
|
|
+ for server_group_id in server_group_id_list:
|
|
|
+ request = alb_20200616_models.UpdateServerGroupServersAttributeRequest(
|
|
|
+ servers=servers,
|
|
|
+ server_group_id=server_group_id
|
|
|
+ )
|
|
|
+ # logging.info(f"servers = {servers}")
|
|
|
+ runtime = util_models.RuntimeOptions()
|
|
|
+ try:
|
|
|
+ # logging.info(f"instance_id_list = {instance_id_list} request = {request}")
|
|
|
+ alb_client.update_server_group_servers_attribute_with_options(request, runtime)
|
|
|
+ logging.info(
|
|
|
+ f"Successfully updated instance_ids_sub_array {instance_ids_sub_array} in group {server_group_id} to weight {weight}.")
|
|
|
+ except Exception as e:
|
|
|
+ logging.error(e)
|
|
|
+ sys.exit()
|
|
|
+
|
|
|
|
|
|
def update_server_group_servers_attribute(alb_client, server_group_id_list, instance_id_list, weight_list, port):
|
|
|
"""
|
|
@@ -513,7 +558,7 @@ def check_server_group_status(alb_client, server_group_id_list):
|
|
|
for server_group in server_groups:
|
|
|
if server_group.get("ServerGroupStatus") == "Available":
|
|
|
logging.info(f"Server group {server_group} is available.")
|
|
|
- count +=1
|
|
|
+ count += 1
|
|
|
if count == len(server_group_id_list):
|
|
|
flag = True
|
|
|
break
|
|
@@ -521,4 +566,4 @@ def check_server_group_status(alb_client, server_group_id_list):
|
|
|
except Exception as e:
|
|
|
logging.error(e)
|
|
|
if not flag:
|
|
|
- sys.exit()
|
|
|
+ sys.exit()
|