一、环境依赖
对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。