F5 rest api 各对象使用方式详解

本篇文章介绍rest api接口下Collection、Resource、Subcollections、SubResource的各种使用方法。如果您不了解这是什么,请查看上一篇F5 api接口开发实战(一)的最后一部分。

1、Collection

Collection是Resource的一个集合,比如ltm上的所有pool就是一个Collection。以ltm pools的Collection为例,其api深度为

poolCollection = bigipRest.tm.ltm.pools

具有两种主要方法,查询和删除。主要介绍查询方法,如下所示为查询条件:

参数 说明
$filter 过滤条件,指定parttion后可以过滤对应的结果,目前只支持parttion
$select 指定结果中返回的属性,可以去掉不需要的属性,节省开销
$top 一般与$skip一起使用,指定想要获取的数量
$skip 一般与$top一起使用,指定想要跳过的条目数量
expandSubcollections 指定此字段为true后,将获取Resource下的Subcollections,否则仅返回一个链接。默认为否
option 此查询如果在tmsh命令行中可以设置选项,那么也可以设置于此
ver 指定rest api的版本,不指定则使用当前F5的默认版本。此选项可以避免F5升级导致api版本变动引起接口不可用

1.1 获取全部Resource的全部属性

不指定任何参数,则默认获取全部

# 获取所有pool
pools = bigipRest.tm.ltm.pools.get_collection()
# 返回一个列表,其中每一项都是pool的Resource对象

debug上述代码,查看pool的Resource对象后可以发现它具有非常多的属性,这些属性都可以在1.2的方法中用于指定获取字段

1.2 获取指定属性

上述获取的pool Resource对象包含了全部属性,大部分是我们 不需要的,那么我们可以筛选有用字段,传入指定参数即可。

# 获取所有pool,但只需要包含name、loadBalancingMode和partition这三个参数
pools = bigipRest.tm.ltm.pools.get_collection(requests_params={'params': '$select=name,loadBalancingMode,partition'})
# 返回一个列表,其中每一项都是一个字典,只包含这三个键值对

查看上述结果可以发现,返回结果不再是Resource对象,而是一个只包含上述指定三个关键字的键值对,节省了网络和F5设备开销。

1.3 筛选返回结果

当我们想指定某个partition的结果时,可以使用过滤条件。

# 获取partition等于part1的所有pool
pools = bigipRest.tm.ltm.pools.get_collection(requests_params={'params': '$filter=partition+eq+part1'})

“+” 符号可以使用空格替代

1.4 过滤结果条目数量

还可以对返回结果进行分页,指定top和skip字段

# 跳过前面5个,从第6个开始获取8个对象
pools = bigipRest.tm.ltm.pools.get_collection(requests_params={'params': '$top=8&$skip=5'})
# 返回一个列表,其中包含8个Resource对象

如果所获取的值超过了Resource的数量,则返回结果会少于$top中的值,最少为空列表

1.5 获取Resource下的Subcollections

debug上述代码,会发现返回的Resource对象中,只有指向下一层Subcollections的链接,而没有详细信息。比如,当我们使用1.2的方法获取全部pool时,返回的结果中每个pool对象只包含pool的属性,比如monitor、loadBalancingMode等,并不包含members的信息。此时我们可以指定expandSubcollections参数为true。

# 获取所有pool下members的信息
pools = bigipRest.tm.ltm.pools.get_collection(requests_params={'params': {'expandSubcollections': 'true'}})
# 返回结果中membersReference下多了一个items属性,其中包含了members的详细信息

1.6 组合查询

以上所有字段都可以组合查询,使用&连接不同参数即可。同时,也可以使用另一种风格的参数结构,如下所示

requests_params={'params': {'$select': 'name,loadBalancingMode,partition', '$top': 3,'$skip':5}}

1.7 删除Collection

一般情况下,请不要使用删除方法删除Collection,这可能会清除F5上的全部某项配置,是很危险的行为。使用删除时,简单地调用是不行的,必须指定options选项。

# 删除以bb为结尾的pool
res = bigipRest.tm.ltm.pools.delete_collection(requests_params={'params': 'options=*bb'})
# 删除全部pool
res = bigipRest.tm.ltm.pools.delete_collection(requests_params={'params': 'options=*'})
# 删除名字叫poolname的pool
res = bigipRest.tm.ltm.pools.delete_collection(requests_params={'params': 'options=poolname'})
  • option选项所使用的通配符,与tmsh中用到的一致。

  • delete_collection使用另一种字典风格的参数结构会报错

2、Resource

Resource是一个配置项,比如一个ltm pool,一个monitor,一个node等。以ltm pool的Resource为例,其api深度为

poolResource = bigipRest.tm.ltm.pools.pool

具有查询、更新、新增、删除等方法。

2.1 加载Resource对象

# 根据名字和partition加载指定对象
pool = bigipRest.tm.ltm.pools.pool.load(name='poolname', partition='Common')
# 返回结果是一个pool的Resource对象

本方法同样支持expandSubcollections参数,如下

# 指定expandSubcollections加载指定对象
pool = bigipRest.tm.ltm.pools.pool.load(name='poolname', partition='Common', requests_params={'params': {'expandSubcollections': 'true'}})
# 返回Resource对象中的items属性包含members的详细信息

不指定partition,则默认为Common,下同

2.2 判断Resource存在性

# 根据名字和partition判断指定Resource是否存在
res = bigipRest.tm.ltm.pools.pool.exists(name='poolname', partition='Common')
# 返回结果是布尔值

2.3 新增Resource

# 指定名字和partition,创建Resource对象
pool = bigipRest.tm.ltm.pools.pool.create(name='poolname', partition='Common')
# 返回创建完毕的Resource对象

2.4 更新Resource

# 加载pool
pool = bigipRest.tm.ltm.pools.pool.load(name='poolname', partition='Common')
# 调用update方法修改负载均衡方式为最小连接数
pool.loadBalancingMode = 'least-connections-member'
pool.update()
# 也可以直接一步更新
pool.update(loadBalancingMode='least-connections-member')

2.5 删除Resource

# 加载pool
pool = bigipRest.tm.ltm.pools.pool.load(name='poolname', partition='Common')
# 调用delete方法删除
pool.delete()

注意,这与1.7删除Collection不是一回事,他们所导致的结果可能一样,但是这两种删除方式不同。

2.6 刷新Resource

当加载一个Resource时,如果处于某种原因,这个Resource的配置在另外的地方被修改了(比如,通过另一个对象,通过web页面,通过tmsh命令行等),再获取这个Resource对象的配置就会不准。此时使用刷新方法即可解决。

# 加载pool
pool = bigipRest.tm.ltm.pools.pool.load(name='poolname', partition='Common')
print(pool.loadBalancingMode) #发现此时负载均衡方式为'least-connections-member'
# 在web页面上把负载均衡修改为round-robin
print(pool.loadBalancingMode) #依然为'least-connections-member'
# 刷新Resource对象
pool.refresh()
print(pool.loadBalancingMode) #变为'round-robin',正确

3、Subcollections

Subcollections是属于Resource下的配置。比如某个ltm pool下的一组members就是Subcollections。

Subcollections有两种获取方式

  1. 通过requests_params={'params': {'expandSubcollections': 'true'}}参数从Collection或者Resource中直接获取,可参见本页1.5和2.1节。
  2. 通过Resource对象获取

3.1 通过Resource对象获取Subcollections

# 加载pool
pool = bigipRest.tm.ltm.pools.pool.load(name='poolname', partition='Common')
# 从pool中获取members
members = pool.members_s.get_collection()
# 返回一个列表,其中每一项都是member的SubResource对象

Subcollections的get_collection()方法与Collection相比,在requests_params中只支持$top$skip$select三种传参,其他方法本人没有试出来,可能并不起效。

Subcollections没有delete_collection()方法。

4、SubResource

SubResource是Subcollections下的单个资源,以ltm pool为例,SubResource即pool下的member。SubResource支持的方法与Resource类似,但首先需要先获取Resource。

# 加载pool
pool = bigipRest.tm.ltm.pools.pool.load(name='poolname', partition='Common')
# 后续的操作都在pool上进行

4.1 加载SubResource

# 根据名字和partition加载指定SubResource对象
member = pool.members_s.members.load(name='1.3.6.5:81', partition='Common')
# 返回member的SubResource对象

4.2 判断SubResource存在性

# 根据名字和partition判断member是否存在
res = pool.members_s.members.exists(name='1.3.6.15:81', partition='Common')
# 返回结果是布尔值

4.3 新增SubResource

# 新增members
pool.members_s.members.create(name='1.2.3.4:80', partition='Common')
# 返回新增member的SubResource对象

4.4 更新SubResource

# 加载member
member = pool.members_s.members.load(name='1.3.6.5:81', partition='Common')
# 修改member的属性
member.priorityGroup = 2
member.update()

4.5 删除SubResource

# 加载member
member = pool.members_s.members.load(name='1.3.6.5:81', partition='Common')
# 调用delete方法删除
pool.delete()

4.6 刷新SubResource

# 加载member
member = pool.members_s.members.load(name='1.3.6.5:81', partition='Common')
print(member.ratio) #发现此时比率为1
# 在web页面上把ratio修改为2
print(member.ratio) #依然为1
# 刷新member对象
member.refresh()
print(member.ratio) #变为2,正确

以上可以看出,SubResource的操作基本与Resource一致。

5、举一反三

上述通过以ltm pool 为例,说明了Collection、Resource、Subcollections、SubResource的各种用法。实际应用中,了解了上述的api结构,需要知道我当前配置资源的api深度和所属的对象类型,即可举一反三地了解到配置方法。

比如,我目前需要配置gtm的server,那么我只需要知道:

  1. server所属于什么对象?Collection和Resource
  2. server的api深度是多少?bigipRest.tm.gtm.serversbigipRest.tm.gtm.servers.server

那么,很简单,我对server做查询、更新、删除、新增操作时,就可以调用上面介绍的方法,比如:

# 获取全部server
servers = bigipRest.tm.gtm.servers.get_collection()
# 加载server对象
server = bigipRest.tm.gtm.servers.server.load(name='server1', partition='Common')
# 删除server对象
server.delete()

具体不再赘述。对于一些常见的用法,更详细的说明会在下一篇文章中介绍。

F5 api接口开发实战手册(二)的更多相关文章

  1. F5 api接口开发实战(一)

    本人从18年下旬,开始从事F5负载均衡的自动化开发工作,主要使用python编程语言,开发的F5功能模块为LTM和GTM. F5开发简介 1.F5管理模式 F5的管理模式主要有4种(不包含snmp), ...

  2. API接口开发 配置、实现、测试

    Yii2 基于RESTful架构的 advanced版API接口开发 配置.实现.测试 环境配置: 开启服务器伪静态 本处以apache为例,查看apache的conf目录下httpd.conf,找到 ...

  3. [原创].NET 分布式架构开发实战之二 草稿设计

    原文:[原创].NET 分布式架构开发实战之二 草稿设计 .NET 分布式架构开发实战之二 草稿设计 前言:本篇之所以称为草稿设计,是因为设计的都是在纸上完成的.反映了一个思考的过程. 本篇的议题如下 ...

  4. 浅谈使用 PHP 进行手机 APP 开发(API 接口开发)

    做过 API 的人应该了解,其实开发 API 比开发 WEB 更简洁,但可能逻辑更复杂,因为 API 其实就是数据输出,不用呈现页面,所以也就不存在 MVC(API 只有 M 和 C),那么我们来探讨 ...

  5. 示例浅谈PHP与手机APP开发,即API接口开发

    示例浅谈PHP与手机APP开发,即API接口开发 API(Application Programming Interface,应用程序接口)架构,已经成为目前互联网产品开发中常见的软件架构模式,并且诞 ...

  6. WCF开发实战系列二:使用IIS发布WCF服务

    WCF开发实战系列二:使用IIS发布WCF服务 (原创:灰灰虫的家http://hi.baidu.com/grayworm) 上一篇中,我们创建了一个简单的WCF服务,在测试的时候,我们使用VS200 ...

  7. 利用postman进行api接口开发

    场景: api接口开发时,经常使用一些工具来帮助设计开发.Yapi主要是在设计阶段进行api接口设计,统一前后端参数请求和返回体:swagger主要在开发阶段,用来显示实际上后端开发进度和接口情况:p ...

  8. SDL 开发实战(二):SDL 2.0 核心 API 解析

    在上一篇文章 SDL 开发实战(一):SDL介绍及开发环境配置 中,我们配置好了SDL的开发环境,并成功运行了SDL的Hello World 代码.但是可能大部分人还是读不太明白具体Hello Wol ...

  9. .NET微信扫码支付模式二API接口开发测试

    主要实现微信扫码支付,官网的SDKdemo 就不要使用 一直不能调试通过的,还是自己按照API接口文档一步一步来实现,吐槽下微信一点责任感都木有,能不能demo搞个正常的吗,不要坑惨了一大群码农们有点 ...

随机推荐

  1. Day09_43_Set集合_HashSet_02(HashCode方法 与 equals方法 )

    HashSet - 向Hash表中添加元素的过程? 1. 先调用将要被存储的值key的HashCode方法得出Hash值,如果该Hash值在现有Hash表中不存在,那么直接加入元素. 2. 如果该Ha ...

  2. Python基础之容易忘记的地方

    (1)编译型与解释型语言区别: 编译型:一次性,把所有代码编译成机器能识别的二进制码,再运行 代表语言:c,c++ 优点: 执行速度块 缺点: 开发速度慢,调试周期长 解释型:代码从上到下一行一行解释 ...

  3. Scrapy的流程

    Scrapy框架的架构如下图 具体部分说明: Engine:引擎,处理整个系统的数据流处理,出发事物,是整个框架的核心 Item:项目.定义了爬取结果的数据结构,爬取的数据会被赋值成该Item对象 S ...

  4. 生成https证书脚本

    [root@yc1 ~]# cat yc_https.sh #!/bin/bash hostname=192.168.23.140 rm -rf /etc/pki/CA &>/dev/n ...

  5. hdu3793 判断对称(水题)

    题意:       给你一个串,问你这个串是不是关于某个字母对称的,这个串是一个首位相接的圆. 思路:       水题,直接枚举每一个为对称点试一下就行了,不解释了. #include<std ...

  6. Intel汇编程序设计-整数算术指令(上)

    第七章 整数算术指令 7.1 简介 每种汇编语言都有进行操作数移位的指令,移位和循环移位指令在控制硬件设备.加密数据,以及实现高速的图形操作时特别有用.本章讲述如何进行移位和循环移位操作以及如何使用移 ...

  7. Activity,Tasks

    常见的一些Activity的打开方式: //1.拨打电话 // 给移动客服10086拨打电话 Uri uri = Uri.parse("tel:10086"); Intent in ...

  8. 从刚毕业的5K测试到20K测试大佬,与薪资相匹配的永远是实力!

    有个话题"软件测试的工资高还是开发者的工资高?"软件测试和软件开发门槛有差异,在职业起步阶段收入也会有一定的差异,这算是行业内公开的秘密.但随着工作年限的增加,经验的逐步积累,软件 ...

  9. API网关才是大势所趋?SpringCloud Gateway保姆级入门教程

    什么是微服务网关 SpringCloud Gateway是Spring全家桶中一个比较新的项目,Spring社区是这么介绍它的: 该项目借助Spring WebFlux的能力,打造了一个API网关.旨 ...

  10. CRM系统自动化业务流程的好处

    CRM系统的自动化可以简单化企业大部分工作,而且覆盖销售,市场,服务和财务部门,使团队有大量时间花在业务流程上. CRM系统自动化的建立是为了更好地使工作更为简单且便于管理,自动化释放出来员工的时间, ...