最近给公司新上了堡垒机,需求是在EC2上更新的时候直接修改负载均衡权重,后续都登入堡垒机,就不要再登入阿里云的网页去修改。- -目前还没有发布系统。看了阿里的文档还是很齐全的,写了2个版本 修改虚拟服务器权重 修改默认服务器权重,阿里都给了接口。研发的需求就是start启动 stop停止,权重100启动, 权重0停止 ,阿里好像也可以有开关的接口没去研究。
实现过程:先查询本机的IP根据内网IP查出ECS实例ID,最后根据ECSID查询关联的负载均衡修改。
脚本用法:
python3 脚本名 start #修改本机权重为100
python3 脚本名 stop #修改本机权重为0
python3 脚本名 status #查询本机所在的负载均衡信息,显示实例ID和权重信息
python3 脚本名 start ‘Serverid;Serverid’ #启停多台用分号隔开,Serverid就是Ecsid,STATUS命令可以查询;
使用效果截图隐藏去实例ID 可以直接关联在发布脚本里面 更新应用启停 ;
默认服务器组
#!/usr/bin/env python3
# coding=utf-8
import json
import sys
import netifaces
from aliyunsdkcore.client import AcsClient
from aliyunsdkslb.request.v20140515.DescribeLoadBalancerAttributeRequest import DescribeLoadBalancerAttributeRequest
from aliyunsdkslb.request.v20140515.DescribeLoadBalancersRequest import DescribeLoadBalancersRequest
from aliyunsdkslb.request.v20140515.SetBackendServersRequest import SetBackendServersRequest
from aliyunsdkecs.request.v20140526.DescribeInstancesRequest import DescribeInstancesRequest
client = AcsClient('填写你的acskey', '填写你的sec', '所在区域')
def status(loadbalancerid):
#查询本机现在挂在哪个SLB下的所有信息
request = DescribeLoadBalancerAttributeRequest()
request.set_accept_format('json')
request.set_LoadBalancerId(loadbalancerid)
response = client.do_action_with_exception(request)
data = json.loads(response)["BackendServers"]['BackendServer']
print("BackendServers:")
for ecs in data:
print("ServerId:" + str(ecs['ServerId']), "Weight:" + str(ecs['Weight']))
def modify(serverid, weight, loadbalancerid):
#修改权重
request = SetBackendServersRequest()
request.set_accept_format('json')
request.set_LoadBalancerId(loadbalancerid)
BackendServers = []
for server in serverid:
if server == '':
continue
BackendServers.append({"ServerId": server, "Weight": weight})
request.set_BackendServers(BackendServers)
response = client.do_action_with_exception(request)
print(str(response, encoding='utf-8'))
def ecs_id():
#根据本机IP查询ecsid 就是Serverid
ip = netifaces.ifaddresses('eth0')[netifaces.AF_INET][0]['addr']
request = DescribeInstancesRequest()
request.set_accept_format('json')
request.set_PrivateIpAddresses("['%s']" % ip)
try:
response = client.do_action_with_exception(request)
data = json.loads(response)["Instances"]['Instance'][0]['InstanceId']
return data
except:
print("Get ecs_id exception")
sys.exit(1)
def balancer_id(server_id):
#根据实例ID查询SLB信息
request = DescribeLoadBalancersRequest()
request.set_accept_format('json')
request.set_ServerId(server_id)
response = client.do_action_with_exception(request)
data = json.loads(response)['LoadBalancers']['LoadBalancer'][0]['LoadBalancerId']
return data
def main():
if len(sys.argv[:]) == 1 or len(sys.argv[:]) > 3:
print(
"The 'start' localhost loadbalance weight set to 100\nThe 'stop' localhost loadbalance set to 0\n\nExamples:\npython3 aliyun_slb.py status|start|stop\npython3 aliyun_slb.py start|stop 'i-wz***;i-wz***'")
sys.exit(1)
server_id = ecs_id()
loadbalancerid = balancer_id(server_id)
if sys.argv[1] in ['status', 'Status', 'STATUS']:
print("The localhost LoadBalancerId:\n%s" % loadbalancerid)
status(loadbalancerid)
elif sys.argv[1] in ['start', 'Start', 'START']:
if len(sys.argv[:]) == 3:
#修改权重 这边没有更多要求就修改100算启动 0算停止
server_id = sys.argv[2].split(';')
weight = 100
modify(server_id, weight, loadbalancerid)
else:
weight = 100
modify(server_id.split(';'), weight, loadbalancerid)
elif sys.argv[1] in ['stop', 'Stop', 'STOP']:
if len(sys.argv[:]) == 3:
server_id = sys.argv[2].split(';')
weight = 0
modify(server_id, weight, loadbalancerid)
else:
weight = 0
modify(server_id.split(';'), weight, loadbalancerid)
else:
print(
"The 'start' localhost loadbalance weight set to 100\nThe 'stop' localhost loadbalance set to 0\n\nExamples:\npython3 aliyun_slb.py status|start|stop\npython3 aliyun_slb.py start|stop 'i-wz***;i-wz***'")
if __name__ == '__main__':
main()
虚拟服务器组
为了和默认服务器组使用效果一样,这边虚拟服务器要知道ECS关联是哪个虚拟服务器组,不是根据slb id来关联,感觉绕来绕去有点懵,先能用后续再优化;
#!/usr/bin/env python3
# coding=utf-8
import json
import sys
import netifaces
from aliyunsdkcore.client import AcsClient
from aliyunsdkslb.request.v20140515.DescribeLoadBalancersRequest import DescribeLoadBalancersRequest
from aliyunsdkecs.request.v20140526.DescribeInstancesRequest import DescribeInstancesRequest
from aliyunsdkslb.request.v20140515.DescribeVServerGroupsRequest import DescribeVServerGroupsRequest
from aliyunsdkslb.request.v20140515.DescribeVServerGroupAttributeRequest import DescribeVServerGroupAttributeRequest
from aliyunsdkslb.request.v20140515.SetVServerGroupAttributeRequest import SetVServerGroupAttributeRequest
client = AcsClient('', '', '')
def status(loadbalancerid):
request = DescribeVServerGroupsRequest()
request.set_accept_format('json')
request.set_LoadBalancerId(loadbalancerid)
response = client.do_action_with_exception(request)
data = json.loads(response)["VServerGroups"]["VServerGroup"]
groups = []
for group in data:
groups.append(group['VServerGroupId'])
request = DescribeVServerGroupAttributeRequest()
request.set_accept_format('json')
ecs_group = {}
id_weight = []
for groupid in groups:
request.set_VServerGroupId(groupid)
response = client.do_action_with_exception(request)
for ecs in json.loads(response)["BackendServers"]["BackendServer"]:
ecs_group[str(ecs['ServerId'])] = groupid
id_weight.append(f"ServerId:{ecs['ServerId']} Weight:{ecs['Weight']}")
return ecs_group, id_weight
def modify(serverid, weight, vservergroupid):
request = SetVServerGroupAttributeRequest()
request.set_accept_format('json')
request.set_VServerGroupId(vservergroupid)
BackendServers = []
for server in serverid:
if server == '':
continue
BackendServers.append({"ServerId": server, "Weight": weight, "Port": "80"})
request.set_BackendServers(BackendServers)
response = client.do_action_with_exception(request)
print(str(response, encoding='utf-8'))
def ecs_id():
ip = netifaces.ifaddresses('eth0')[netifaces.AF_INET][0]['addr']
request = DescribeInstancesRequest()
request.set_accept_format('json')
request.set_PrivateIpAddresses("['%s']" % ip)
try:
response = client.do_action_with_exception(request)
data = json.loads(response)["Instances"]['Instance'][0]['InstanceId']
return data
except:
print("Get ecs_id exception")
sys.exit(1)
def balancer_id(server_id):
request = DescribeLoadBalancersRequest()
request.set_accept_format('json')
request.set_ServerId(server_id)
response = client.do_action_with_exception(request)
data = json.loads(response)['LoadBalancers']['LoadBalancer'][0]['LoadBalancerId']
return data
def main():
if len(sys.argv[:]) == 1 or len(sys.argv[:]) > 3:
print(
"The 'start' localhost loadbalance weight set to 100\nThe 'stop' localhost loadbalance set to 0\n\nExamples:\npython3 aliyun_slb.py status|start|stop\npython3 aliyun_slb.py start|stop 'i-wz***;i-wz***'")
sys.exit(1)
server_id = ecs_id()
loadbalancerid = balancer_id(server_id)
if sys.argv[1] in ['status', 'Status', 'STATUS']:
print("The localhost LoadBalancerId:\n%s" % loadbalancerid)
result_group, result_ecs = status(loadbalancerid)
for result in result_ecs:
print(result)
elif sys.argv[1] in ['start', 'Start', 'START']:
if len(sys.argv[:]) == 3:
result_group, result_ecs = status(loadbalancerid)
server_id = sys.argv[2].split(';')
weight = 100
modify(server_id, weight, result_group['%s' % server_id])
else:
result_group, result_ecs = status(loadbalancerid)
weight = 100
modify(server_id.split(';'), weight, result_group['%s' % server_id])
elif sys.argv[1] in ['stop', 'Stop', 'STOP']:
if len(sys.argv[:]) == 3:
result_group, result_ecs = status(loadbalancerid)
server_id = sys.argv[2].split(';')
weight = 0
modify(server_id, weight, result_group['%s' % server_id])
else:
result_group, result_ecs = status(loadbalancerid)
weight = 0
modify(server_id.split(';'), weight, result_group['%s' % server_id])
else:
print(
"The 'start' localhost loadbalance weight set to 100\nThe 'stop' localhost loadbalance set to 0\n\nExamples:\npython3 aliyun_slb.py status|start|stop\npython3 aliyun_slb.py start|stop 'i-wz***;i-wz***'")
if __name__ == '__main__':
main()
SLB迁移到ALB了又瞎写了 随便用吧
# -*- coding: utf-8 -*-
# This file is auto-generated, don't edit it. Thanks.
from typing import List
import sys
import time
import netifaces
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_20200616_models
class Sample:
def __init__(self):
pass
@staticmethod
def create_client(
access_key_id: str,
access_key_secret: str,
) -> Alb20200616Client:
"""
使用AK&SK初始化账号Client
@param access_key_id:
@param access_key_secret:
@return: Client
@throws Exception
"""
config = open_api_models.Config(
# 您的AccessKey ID,
access_key_id=access_key_id,
# 您的AccessKey Secret,
access_key_secret=access_key_secret
)
# 访问的域名
config.endpoint = 'alb.cn-shenzhen.aliyuncs.com'
return Alb20200616Client(config)
@staticmethod
def main(
args: List[str],
) -> None:
# AccessKey ID,AccessKey Secret,
client = Sample.create_client(
'', '')
if args[0] == 'status':
try:
ip = args[1]
except:
ip = netifaces.ifaddresses(
'eth0')[netifaces.AF_INET][0]['addr']
result = Sample.statu(ip)
if len(result) > 6:
for i in result:
print(i)
else:
print(result)
elif args[0] in ['start', 'deploy', 'stop']:
ip = args[1]
result = Sample.statu(ip)
if args[0] == 'start':
weight = 100
elif args[0] == 'deploy':
weight = 10
elif args[0] == 'stop':
weight = 0
servers_0 = alb_20200616_models.UpdateServerGroupServersAttributeRequestServers(
server_id=result['serverid'],
weight=weight,
server_type='Ecs',
port=80
)
update_server_group_servers_attribute_request = alb_20200616_models.UpdateServerGroupServersAttributeRequest(
server_group_id=result['servergroupid'],
servers=[
servers_0
]
)
client.update_server_group_servers_attribute(
update_server_group_servers_attribute_request)
time.sleep(6)
print(Sample.statu(ip))
def statu(ip):
client = Sample.create_client(
'', '')
list_server_groups_request = alb_20200616_models.ListServerGroupsRequest()
client.list_server_groups(list_server_groups_request)
resp = client.list_server_groups(list_server_groups_request)
lbinfo = []
for data in resp.body.server_groups:
servergroupid = (eval(str(data))['ServerGroupId'])
list_server_group_servers_request = alb_20200616_models.ListServerGroupServersRequest(
server_group_id=servergroupid)
resp = client.list_server_group_servers(
list_server_group_servers_request)
for info in eval(str(resp.body))['Servers']:
serverid = info['ServerId']
serverip = info['ServerIp']
weight = info['Weight']
port = info['Port']
if ip != '' and ip == serverip:
return{'servergroupid': servergroupid, 'serverid': serverid, 'serverip': serverip, 'Port': port, 'weight': weight}
else:
lbinfo.append({'servergroupid': servergroupid, 'serverid': serverid,
'serverip': serverip, 'Port': port, 'weight': weight})
return lbinfo
if __name__ == '__main__':
Sample.main(sys.argv[1:])