python F5创建pool和创建member(一)

一、环境依赖
对f5进行操作,我们需要下载f5-sdk的依赖包。

f5-sdk==3.0.21
urllib3==1.25.7
# 安装命令:
pip install f5-sdk==3.0.21 urllib3==1.25.7

二、有关官方的样例介绍
f5-sdk网址
在这里插入图片描述
在开发的时候,由于导入的依赖是sdk,意味着我们可以直接使用里面的代码来为自己服务。
三、创建member
在这里,我自己封装了一个class类,方便管理。代码如下:

from f5.bigip import ManagementRoot
from icontrol.exceptions import iControlUnexpectedHTTPError


class F5Manage(object):
    def __init__(self, hostname, username, password, port=None):
        self.config = None
        self.hostname = hostname
        self.username = username
        self.password = password
        self.port = port
        try:
            if port:
                self.mgmt = ManagementRoot(hostname=hostname,
                                           username=username,
                                           password=password,
                                           port=port)
            else:
                self.mgmt = ManagementRoot(hostname=hostname,
                                           username=username,
                                           password=password)
            self.result = True
        except Exception as e:
            self.result = False
            self.message = e

    def deal_message(self, mes):
        if isinstance(mes, iControlUnexpectedHTTPError):
            text = json.loads(mes.response.text)
            message = text['message']
        else:
            message = mes
        return message
    
    def create_member(self, member_ip, member_name=None, partition=None):
        """

        :param member_ip: member地址
        :param member_name: member名称
        :param partition: partition类似于分区/文件的概念
        :return:
        """
        data = {"message": u'member创建成功', "result": True}
        try:
            self.mgmt.tm.ltm.nodes.node.create(partition=(partition if partition else 'Common'),
                                               name=(member_name if member_name else member_ip),
                                               address=member_ip)

        except Exception as e:
            data["message"] = self.deal_message(e)
            data["result"] = False
        return data

四、创建pool(含有member成员的pool)

from f5.bigip import ManagementRoot
from icontrol.exceptions import iControlUnexpectedHTTPError


class F5Manage(object):
    def __init__(self, hostname, username, password, port=None):
        self.config = None
        self.hostname = hostname
        self.username = username
        self.password = password
        self.port = port
        try:
            if port:
                self.mgmt = ManagementRoot(hostname=hostname,
                                           username=username,
                                           password=password,
                                           port=port)
            else:
                self.mgmt = ManagementRoot(hostname=hostname,
                                           username=username,
                                           password=password)
            self.result = True
        except Exception as e:
            self.result = False
            self.message = e

    def deal_message(self, mes):
        if isinstance(mes, iControlUnexpectedHTTPError):
            text = json.loads(mes.response.text)
            message = text['message']
        else:
            message = mes
        return message
    
    def create_member(self, member_ip, member_name=None, partition=None):
        """

        :param member_ip: member地址
        :param member_name: member名称
        :param partition: partition类似于分区/文件的概念
        :return:
        """
        data = {"message": u'member创建成功', "result": True}
        try:
            self.mgmt.tm.ltm.nodes.node.create(partition=(partition if partition else 'Common'),
                                               name=(member_name if member_name else member_ip),
                                               address=member_ip)

        except Exception as e:
            data["message"] = self.deal_message(e)
            data["result"] = False
        return data 
    
    def create_pool(self, pool_name, mem_list, monitor=None, partition=None):
        """
        创建pool
        :param pool_name:
        :param mem_list: member的list内容列表
        :param partition:
        :param monitor:
        :return:
        """
        data = {"message": u'pool创建成功', "result": True}
        pool_obj = None
        mem_list_obj = []
        try:
            self.mgmt.tm.ltm.pools.pool.create(name=pool_name,
                                               partition=(partition if partition else 'Common'),
                                               monitor=(monitor if monitor else ''))
            pool_obj = self.mgmt.tm.ltm.pools.pool.load(name=pool_name,
                                                        partition=(partition if partition else 'Common'))
            for mem in mem_list:
                pool_obj.members_s.members.create(
                    partition=(partition if partition else 'Common'),
                    name=(mem["member_name"] if mem["member_name"] else mem["ip"]) + ":" + str(mem["port"]),
                    address=mem["ip"])
                mem_list_obj.append(self.mgmt.tm.ltm.nodes.node.load(
                    partition=(partition if partition else 'Common'),
                    name=(mem["member_name"] if mem["member_name"] else mem["ip"]),
                    address=mem["ip"]))
        except Exception as e:
            data["message"] = self.deal_message(e)
            data["result"] = False
            if pool_obj:
                pool_obj.delete()
            for mem_obj in mem_list_obj:
                mem_obj.delete()
        return data

注意:
① 单独创建member,不需要member的名称也可以创建,名称会默认为IP。
② 创建Pool的时候,附带创建member,必须传入member的名称,不然无法创建。
③ 单独创建member和创建Pool是创建member,使用的方法是不一样的。
④ 单独创建member时,不允许名字或者IP重复。
⑤ 创建Pool时,创建member,如果创建已经存在的member,就相当于把已经存在的member加入到Pool中;如果创建的member不存在,则会创建一个新的member。
⑥ 创建Pool时,mem_list内的member不允许出现名称或者IP重复,否则就会报错,抛出异常。
⑦ 创建Pool时,如果是由于创建抛出异常,导致创建的进度成功一半,就如同入库一样,没有全部入库,就会造成数据污染。这里也是一样,所以会把已经创建的数据删除。
⑧ 登录时,是有port概念的,如果f5的port端口发生更改,不是默认端口,这个时候端口就有必要当成参数传入进去。默认端口:443。

猜你喜欢

转载自blog.csdn.net/qq_42631707/article/details/103159758