|  | @@ -21,9 +21,9 @@ from aliyunsdkcore.request import CommonRequest
 | 
	
		
			
				|  |  |  from alibabacloud_alb20200616.client import Client as Alb20200616Client
 | 
	
		
			
				|  |  |  from alibabacloud_tea_openapi import models as open_api_models
 | 
	
		
			
				|  |  |  from alibabacloud_alb20200616 import models as alb_models
 | 
	
		
			
				|  |  | +from alibabacloud_alb20200616 import models as alb_20200616_models
 | 
	
		
			
				|  |  |  from alibabacloud_tea_util import models as util_models
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  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')
 | 
	
	
		
			
				|  | @@ -247,18 +247,20 @@ def run_per_command(client, instance, command):
 | 
	
		
			
				|  |  |      return response
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -def get_instance_ids(client, slb_id):
 | 
	
		
			
				|  |  | +def get_instance_ids(client, server_group_id):
 | 
	
		
			
				|  |  |      """
 | 
	
		
			
				|  |  | -    获取slb下所有服务器instanceId
 | 
	
		
			
				|  |  | +    获取指定服务器组下所有服务器的instanceId
 | 
	
		
			
				|  |  |      :param client: 客户端连接
 | 
	
		
			
				|  |  | -    :param slb_id: 负载均衡id type-string
 | 
	
		
			
				|  |  | +    :param server_group_id: 服务器组ID type-string
 | 
	
		
			
				|  |  |      :return: instance_ids type-list
 | 
	
		
			
				|  |  |      """
 | 
	
		
			
				|  |  | -    request = DescribeLoadBalancerAttributeRequest()
 | 
	
		
			
				|  |  | -    request.set_accept_format('json')
 | 
	
		
			
				|  |  | -    request.set_LoadBalancerId(slb_id)
 | 
	
		
			
				|  |  | -    response = send_request(client=client, request=request)
 | 
	
		
			
				|  |  | -    instance_ids = [instance["ServerId"] for instance in response["BackendServers"]["BackendServer"]]
 | 
	
		
			
				|  |  | +    request = alb_20200616_models.ListServerGroupServersRequest(
 | 
	
		
			
				|  |  | +        server_group_id=server_group_id
 | 
	
		
			
				|  |  | +    )
 | 
	
		
			
				|  |  | +    runtime = util_models.RuntimeOptions()
 | 
	
		
			
				|  |  | +    response = client.list_server_group_servers_with_options(request, runtime)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    instance_ids = [server["ServerId"] for server in response["Servers"]["Server"]]
 | 
	
		
			
				|  |  |      return instance_ids
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -511,85 +513,57 @@ def remove_backend_servers(client, slb_id, instances):
 | 
	
		
			
				|  |  |          sys.exit()
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -def set_instance_weight_process_with_slbs(client, slb_id_list, instance_id_list, weight_list):
 | 
	
		
			
				|  |  | +def set_weight_for_instances_alb(alb_client, server_group_id, instance_id_list, weights):
 | 
	
		
			
				|  |  |      """
 | 
	
		
			
				|  |  | -    修改服务器的权重值
 | 
	
		
			
				|  |  | -    :param client: slb客户端连接
 | 
	
		
			
				|  |  | -    :param slb_id_list: slb id list
 | 
	
		
			
				|  |  | -    :param instance_id_list: instance id list
 | 
	
		
			
				|  |  | +    设置ALB服务器组中实例的权重
 | 
	
		
			
				|  |  | +    :param alb_client: ALB客户端连接
 | 
	
		
			
				|  |  | +    :param server_group_id: 服务器组ID
 | 
	
		
			
				|  |  | +    :param instance_id_list: 实例ID列表
 | 
	
		
			
				|  |  | +    :param weights: 权重列表
 | 
	
		
			
				|  |  | +    :return: None
 | 
	
		
			
				|  |  | +    """
 | 
	
		
			
				|  |  | +    servers = []
 | 
	
		
			
				|  |  | +    for instance_id, weight in zip(instance_id_list, weights):
 | 
	
		
			
				|  |  | +        server = alb_models.AddServersToServerGroupRequestServers(
 | 
	
		
			
				|  |  | +            server_id=instance_id,
 | 
	
		
			
				|  |  | +            server_type='ecs',
 | 
	
		
			
				|  |  | +            weight=weight
 | 
	
		
			
				|  |  | +        )
 | 
	
		
			
				|  |  | +        servers.append(server)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    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 set weights for instances in server group {server_group_id}.")
 | 
	
		
			
				|  |  | +    except Exception as e:
 | 
	
		
			
				|  |  | +        logging.error(f"Failed to set weights for instances: {str(e)}")
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +def set_instance_weight_process_with_alb(alb_client, server_group_id_list, instance_id_list, weight_list):
 | 
	
		
			
				|  |  | +    """
 | 
	
		
			
				|  |  | +    修改ALB服务器组中实例的权重值
 | 
	
		
			
				|  |  | +    :param alb_client: ALB客户端连接
 | 
	
		
			
				|  |  | +    :param server_group_id_list: 服务器组ID列表
 | 
	
		
			
				|  |  | +    :param instance_id_list: 实例ID列表
 | 
	
		
			
				|  |  |      :param weight_list: 权重修改列表 type-list [(weight, sleep_time), ...]
 | 
	
		
			
				|  |  |      :return:
 | 
	
		
			
				|  |  |      """
 | 
	
		
			
				|  |  |      for weight, sleep_time in weight_list:
 | 
	
		
			
				|  |  |          logging.info(f"修改权重中: weight = {weight}")
 | 
	
		
			
				|  |  | -        for slb_id in slb_id_list:
 | 
	
		
			
				|  |  | +        for server_group_id in server_group_id_list:
 | 
	
		
			
				|  |  |              flag = True
 | 
	
		
			
				|  |  |              while flag:
 | 
	
		
			
				|  |  |                  try:
 | 
	
		
			
				|  |  | -                    set_weight_for_instances(client=client, slb_id=slb_id, instance_id_list=instance_id_list, weight=weight)
 | 
	
		
			
				|  |  | -                    logging.info(f"slb: {slb_id} finished!")
 | 
	
		
			
				|  |  | +                    # 使用新的权重设置函数
 | 
	
		
			
				|  |  | +                    set_weight_for_instances_alb(alb_client, server_group_id, instance_id_list, [weight] * len(instance_id_list))
 | 
	
		
			
				|  |  | +                    logging.info(f"服务器组: {server_group_id} 权重设置完成!")
 | 
	
		
			
				|  |  |                      flag = False
 | 
	
		
			
				|  |  |                  except Exception as e:
 | 
	
		
			
				|  |  | +                    logging.error(f"更新权重失败: {e}, 将重试...")
 | 
	
		
			
				|  |  |                      time.sleep(10)
 | 
	
		
			
				|  |  |                      continue
 | 
	
		
			
				|  |  |          time.sleep(sleep_time)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -def add_backend_servers_with_slbs(client, slb_id_list, instances):
 | 
	
		
			
				|  |  | -    """
 | 
	
		
			
				|  |  | -    服务器挂载到负载均衡(必须是状态为运行中的后端服务器才可以加入负载均衡实例,每次调用最多可添加20个后端服务器)
 | 
	
		
			
				|  |  | -    :param client:
 | 
	
		
			
				|  |  | -    :param slb_id_list:
 | 
	
		
			
				|  |  | -    :param instances: 实例列表 [(instance_id, ip), ...]
 | 
	
		
			
				|  |  | -    :return:
 | 
	
		
			
				|  |  | -    """
 | 
	
		
			
				|  |  | -    try:
 | 
	
		
			
				|  |  | -        for i in range(len(instances)//20 + 1):
 | 
	
		
			
				|  |  | -            instances_list = instances[i*20:(i+1)*20]
 | 
	
		
			
				|  |  | -            if len(instances_list) == 0:
 | 
	
		
			
				|  |  | -                return
 | 
	
		
			
				|  |  | -            for slb_id in slb_id_list:
 | 
	
		
			
				|  |  | -                request = AddBackendServersRequest()
 | 
	
		
			
				|  |  | -                request.set_accept_format('json')
 | 
	
		
			
				|  |  | -                request.set_LoadBalancerId(slb_id)
 | 
	
		
			
				|  |  | -                backend_servers = [
 | 
	
		
			
				|  |  | -                    {"ServerId": instance_id, "Weight": "0", "Type": "ecs", "ServerIp": ip_address}
 | 
	
		
			
				|  |  | -                    for instance_id, ip_address in instances_list]
 | 
	
		
			
				|  |  | -                request.set_BackendServers(backend_servers)
 | 
	
		
			
				|  |  | -                response = client.do_action_with_exception(request)
 | 
	
		
			
				|  |  | -                logging.info(f"slb: {slb_id} add backend servers finished!")
 | 
	
		
			
				|  |  | -            logging.info(f"i: {i}, count: {len(instances_list)}, instances: {instances_list} "
 | 
	
		
			
				|  |  | -                         f"add backend servers finished!")
 | 
	
		
			
				|  |  | -    except Exception as e:
 | 
	
		
			
				|  |  | -        logging.error(e)
 | 
	
		
			
				|  |  | -        sys.exit()
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -def remove_backend_servers_with_slbs(client, slb_id_list, instances):
 | 
	
		
			
				|  |  | -    """
 | 
	
		
			
				|  |  | -    服务器从负载均衡移除(一次调用最多可以移除20个后端服务器)
 | 
	
		
			
				|  |  | -    :param client:
 | 
	
		
			
				|  |  | -    :param slb_id_list:
 | 
	
		
			
				|  |  | -    :param instances: 实例列表 [instance_id, ...]
 | 
	
		
			
				|  |  | -    :return:
 | 
	
		
			
				|  |  | -    """
 | 
	
		
			
				|  |  | -    try:
 | 
	
		
			
				|  |  | -        for i in range(len(instances)//20 + 1):
 | 
	
		
			
				|  |  | -            instances_list = instances[i*20:(i+1)*20]
 | 
	
		
			
				|  |  | -            if len(instances_list) == 0:
 | 
	
		
			
				|  |  | -                return
 | 
	
		
			
				|  |  | -            for slb_id in slb_id_list:
 | 
	
		
			
				|  |  | -                request = RemoveBackendServersRequest()
 | 
	
		
			
				|  |  | -                request.set_accept_format('json')
 | 
	
		
			
				|  |  | -                request.set_LoadBalancerId(slb_id)
 | 
	
		
			
				|  |  | -                backend_servers = [
 | 
	
		
			
				|  |  | -                    {"ServerId": instance_id, "Weight": "0", "Type": "ecs"}
 | 
	
		
			
				|  |  | -                    for instance_id in instances_list]
 | 
	
		
			
				|  |  | -                request.set_BackendServers(backend_servers)
 | 
	
		
			
				|  |  | -                response = client.do_action_with_exception(request)
 | 
	
		
			
				|  |  | -                logging.info(f"slb: {slb_id} remove backend servers finished!")
 | 
	
		
			
				|  |  | -            logging.info(f"i: {i}, count: {len(instances_list)}, instances: {instances_list} "
 | 
	
		
			
				|  |  | -                         f"remove backend servers finished!")
 | 
	
		
			
				|  |  | -    except Exception as e:
 | 
	
		
			
				|  |  | -        logging.error(e)
 | 
	
		
			
				|  |  | -        sys.exit()
 |