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

2021-01-12  本文已影响0人  awker

需求背景

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


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

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

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

需求实现

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 。
上一篇下一篇

猜你喜欢

热点阅读