|
@@ -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()
|