美文网首页
Python 实现通过阿里云 API 设置 SLB 后端虚拟服务

Python 实现通过阿里云 API 设置 SLB 后端虚拟服务

作者: awker | 来源:发表于2021-01-12 00:30 被阅读0次

    需求背景

    比如一个后端 Java 服务要部署到 SLB 虚拟服务器组里的 2 台服务器。


    SLB 虚拟服务器组里的 2 台服务器

    每台服务器进行部署时,需要保证没有请求会转发到该服务器,否则用户可能会在请求时报错。
    所以需要有一个 下线 的操作,把当前服务器的权重设置为 0,这样该服务器就不会再接受新请求。然后再把服务部署到该台服务器。
    在部署完成之后,需要有一个 上线 的操作,把服务器的权重设置为原来的值,比如 100,这样该服务器就可以接受新请求。

    备注:
    在微服务场景下,服务下线一般会涉及两部分:

    • 注册中心(Nacos、Eureka、Zookeeper 等)下线(服务停止时自动从注册中心下线;通过调用注册中心下线接口下线服务。)
    • 负载均衡(阿里云 SLB、LVS、Nginx等)下线(设置虚拟服务器组的后端服务器权重为0;移除虚拟服务器组的后端服务器。)

    需求实现

    SLB 虚拟服务器组的接口参考:https://help.aliyun.com/document_detail/35217.html
    需要注意的是 SLB 默认服务器组的接口与虚拟服务器组的接口不一样,参考:https://help.aliyun.com/document_detail/27634.html
    这里实现的是通过 Python 设置 SLB 虚拟服务器组中的服务器权重。

    安装 Pyhon 依赖环境

    # python -V
    Python 2.7.5
    # pip install aliyun-python-sdk-core
    # pip install aliyun-python-sdk-slb
    

    Python 代码实现示例

    # cat set_backend_servers_weight.py 
    #!/usr/bin/env python
    # coding=utf-8
    
    
    from aliyunsdkcore.client import AcsClient
    from aliyunsdkslb.request.v20140515.SetVServerGroupAttributeRequest import SetVServerGroupAttributeRequest
    import argparse
    
    
    class SetLoadBalancerAttribute(object):
        def __init__(self, access_key_id, access_key_secret, region_id):
            self.access_key_id = access_key_id
            self.access_key_secret = access_key_secret
            self.region_id = region_id
    
        def set_vserver_group_attribute(self, vserver_group_id, vserver_group_name, server_id, weight, port):
            client = AcsClient(self.access_key_id, self.access_key_secret, self.region_id)
            request_args = [{"ServerId": server_id, "Weight": int(weight), "Type": "ecs", "Port": int(port)}]
            request = SetVServerGroupAttributeRequest()
            request.set_accept_format('json')
    
            request.set_VServerGroupId(vserver_group_id)
            if vserver_group_name:
                request.set_VServerGroupName(vserver_group_name)
            request.set_BackendServers(request_args)
    
            response = client.do_action_with_exception(request)
            return response
    
    
    if __name__ == "__main__":
        parser = argparse.ArgumentParser()
        parser.add_argument('--vserver_group_id', help='必选,后端服务器组ID,不可更改。', required=True)
        parser.add_argument('--vserver_group_name', help='可选,虚拟服务器组名称,可自定义更改。', default='', required=False)
        parser.add_argument('--server_id', help='String类型,必选,后端服务器的实例ID,不可更改。', required=True)
        parser.add_argument('--weight', help='Integer类型,必选,后端服务器的权重,取值范围:0~100,可自定义更改。', required=True)
        parser.add_argument('--port', help='Integer类型,必选,后端服务器使用的端口,取值范围:1~65535,可自定义更改。', required=True)
        args = parser.parse_args()
        # !!!运行脚本前先修改一下这 3 个参数: access_key_id、access_key_secret、region_id
        slb_api = SetLoadBalancerAttribute("access_key_id", "access_key_secret", "region_id")
        # argparse 默认的变量名是 -- 或 - 后面的字符串,比如 '--weight' 就可以通过 args.weight 来获取参数的值。
        # 但是也可以通过 dest=xxx 来设置参数的变量名,然后在代码中用 args.xxx 来获取参数的值。
        res = slb_api.set_vserver_group_attribute(args.vserver_group_id, args.vserver_group_name, args.server_id,
                                                  args.weight, args.port)
        print res
    
    

    使用方式

    查看帮助信息。

    # python set_backend_servers_weight.py -h
    usage: set_backend_servers_weight.py [-h] --vserver_group_id VSERVER_GROUP_ID
                                         [--vserver_group_name VSERVER_GROUP_NAME]
                                         --server_id SERVER_ID --weight WEIGHT
                                         --port PORT
    
    optional arguments:
      -h, --help            show this help message and exit
      --vserver_group_id VSERVER_GROUP_ID
                            必选,后端服务器组ID,不可更改。
      --vserver_group_name VSERVER_GROUP_NAME
                            可选,虚拟服务器组名称,可自定义更改。
      --server_id SERVER_ID
                            String类型,必选,后端服务器的实例ID,
                            可更改。
      --weight WEIGHT       Integer类型,必选,后端服务器的权重,
                            值范围:0~100,可自定义更改。
      --port PORT           Integer类型,必选,后端服务器使用的端
                            口,取值范围:1~65535,可自定义更改。
    

    设置虚拟服务器组中的其中一台服务器权重为 0 。

    # python set_backend_servers_weight.py --vserver_group_id rsp-wz9wu0b9ixxxx --server_id i-wz91qkxlna0564b7xxxx --weight 0 --port 25074
    {"VServerGroupId":"rsp-wz9wu0b9ixxxx","RequestId":"CA751AFF-A692-4EBE-9344-FC24E42182AC","VServerGroupName":"xx-xxxxx-service_25074","BackendServers":{"BackendServer":[{"Type":"ecs","ServerId":"i-wz91qkxlna0564b7xxxx","Port":25074,"Weight":0},{"Type":"ecs","ServerId":"i-wz9chqvj8ehsw2hcxxxx","Port":25074,"Weight":100}]}}
    
    设置虚拟服务器组中的其中一台服务器权重为 0 。
    设置虚拟服务器组的其中一台服务器权重为 100 。
    # python set_backend_servers_weight.py --vserver_group_id rsp-wz9wu0b9ixxxx --server_id i-wz91qkxlna0564b7xxxx --weight 100 --port 25074
    {"VServerGroupId":"rsp-wz9wu0b9ixxxx","RequestId":"24300A75-A3AF-458D-8ECB-9564B7BD010E","VServerGroupName":"xx-xxxxx-service_25074","BackendServers":{"BackendServer":[{"Type":"ecs","ServerId":"i-wz91qkxlna0564b7xxxx","Port":25074,"Weight":100},{"Type":"ecs","ServerId":"i-wz9chqvj8ehsw2hxxxx","Port":25074,"Weight":100}]}}
    
    设置虚拟服务器组的其中一台服务器权重为 100 。

    相关文章

      网友评论

          本文标题:Python 实现通过阿里云 API 设置 SLB 后端虚拟服务

          本文链接:https://www.haomeiwen.com/subject/fgzjaktx.html