python 修改阿里云负载均衡权重

最近给公司新上了堡垒机,需求是在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:])

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值