使用Python调用API实现ASA设备巡检与配置
今天跟大家分享一个使用Python调用API实现信息查看和配置下发的实例,实验用的是Cisco ASAv,大家感兴趣的话也可以拿物理设备或者其他类型的设备进行测试玩一下,不同设备接口可能会有不同,但方法和套路都适用。话不多说,开始今天内容,首先先科普一波。
什么是API?
API(Application Programming
Interface,应用程序接口)是一些预先定义的函数,或指软件系统不同组成部分衔接的约定。目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问原码,或理解内部工作机制的细节。
上面是百度百科的解释,其实用一句话概括就是:一个允许外部访问的程序接口,通过指定的方式访问可获取对应请求值。
什么是REST API?
REST是Representational State Transfer(表现层状态转移)的缩写,它是由罗伊·菲尔丁(Roy Fielding)提出的,是用来描述创建HTTP API的标准方法的,他发现这四种常用的行为(查看(view),创建(create),编辑(edit)和删除(delete))都可以直接映射到HTTP 中已实现的GET,POST,PUT和DELETE方法。简单理解就是通过HTTP的方式进行请求的API,我们今天使用到的就是REST API。
API优缺点
使用API进行查看和配置的优点
- 响应速度,调用API获取返回值的速度不是模拟SSH登录输入指令获取返回值能比的;
- 数据简洁性,调用API返回的值一般是JSON格式只需简单解析即可用,而SSH采集的数据log普遍需要通过大量正则去匹配。
使用API的缺点
- 不同设备和平台的接口各不相同;
- 部分设备访问API需先在设备上安装agent;
实验环境与目标
实验拓扑
实验目标
- 通过API查看ASAv接口信息;
- 通过API查看ASAv设备信息;
- 通过API对ASAv进行配置;
准备工作
- 官网下载ASA REST
API代理,兼容性可参考官方文档(https://www.cisco.com/c/en/us/td/docs/security/asa/compatibility/asamatrx.html#pgfId-131643) - 使用CLI,确保在ASA上启用了HTTP服务器,并且API客户端可以连接到管理界面,如:
http server enable http 0.0.0.0 0.0.0.0 mgmt
- 使用CLI添加权限账号,具体用到权限等级参考如下:
- 调用监视请求需要特权级别3或更高。
- 调用GET请求需要特权级别5或更高。
- 调用PUT / POST / DELETE操作需要特权级别15。
- 使用CLI为API连接定义HTTP身份验证
aaa authentication http console LOCAL
- 使用CLI在ASA上为API流量创建静态路由
route mgmt 0.0.0.0 0.0.0.0 10.0.12.123
- 上传ASA REST API代理
sho flash: --#-- --length-- -----date/time------ path 80 59128448 Mar 03 2020 06:23:56 asa-restapi-132346-lfbff-k8.SP
- 使用CLI,在ASA上启用ASA REST API代理
rest-api image disk0:asa-restapi-7131-lfbff-k8.SPA rest-api agent
- 可以打开API界面了,网页输入https:///doc/(没有最后的/死活无法打开)
- 可以点击对应API get尝试获取数据,成功的话会在右侧Response Text中查看到对应返回值,如下:
- 找到我们今天需要用到的几个API,分别如下:(如果感兴趣的同学也可以研究一下其他的)
准备就绪,Python搞起来
需要模拟http访问,可以使用urllib或者requestes库实现
- 获取接口信息并做简单解析,调用API:https:///api/interfaces/physical
结果输出def get_interface_info(): requests.packages.urllib3.disable_warnings() req = requests.get('https://10.0.12.10/api/interfaces/physical', headers=headers, auth=('admin','cisco'), verify=False) a = json.loads(req.content) if req.status_code != 200: print('API调用失败,错误代码:{}'.format(req.status_code)) else: for i in a['items']: if i['shutdown'] != True: print('{} 状态UP,Nameif:{},安全等级:{},IP地址:{},掩码:{}'.format (i['hardwareID'], i['name'], i['securityLevel'], i['ipAddress']['ip']['value'], i['ipAddress']['netMask']['value'])
GigabitEthernet0/1 状态UP,Nameif:inside,安全等级:100,IP地址:10.1.1.10,掩码:255.255.255.0 GigabitEthernet0/2 状态UP,Nameif:mgmt,安全等级:100,IP地址:10.0.12.10,掩码:255.255.255.0 GigabitEthernet0/0 状态UP,Nameif:outside,安全等级:0,IP地址:20.1.1.10,掩码:255.255.255.0
- 获取设备硬件信息并做简单解析,调用API:https:///api/monitoring/device(只抓取了CPU、内存、风扇、电源、温度等常用参数)
结果输出(由于我是虚拟机,硬件信息无法查看,不过内存使用率倒是有点异常,有条件的朋友可以测试一下物理环境看看能否正常输出)def get_device_info(): requests.packages.urllib3.disable_warnings() info_list = ['usedMemory','cpuUtilization','powerSupplies','chassisFans','processorFans','chassisTemperature'] req = requests.get('https://10.0.12.10/api/monitoring/device', headers=headers, auth=('admin','cisco'), verify=False) if req.status_code != 200: print('API调用失败,错误代码:{}'.format(req.status_code)) else: a = json.loads(req.content) for i in a['items']: for k,v in i.items(): if k in info_list: print('{}={}'.format(k, v))
cpuUtilization=0 usedMemory=0 powerSupplies=[] processorFans=[] chassisFans=[] chassisTemperature=[]
- 通过post方法配置静态路由和查看SN,调用API:https:///api/monitoring/device
结果输出def post_cli_commands(): headers = {'Content-Type': 'application/json'} data = { "commands": [ "show version | include Serial", "route mgmt 10.0.0.0 255.0.0.0 10.0.12.100" ] } requests.packages.urllib3.disable_warnings() req = requests.post('https://10.0.12.10/api/cli', headers=headers, data=json.dumps(data), auth=('admin','cisco'), verify=False) a = json.loads(req.text) if req.status_code != 200: print('API调用失败,错误代码:{}'.format(req.status_code)) else: for i in a['response']: print(i)
ASAv上查看路由,已成功下发:Serial Number: 9AEX2SC3425
ASAv(config)# sho run route route mgmt 10.0.0.0 255.0.0.0 10.0.12.100 1
以上是本期的所有内容,感谢您的阅读~
希望每个看完本文的您都能有所收获,如果您觉得本文不错,可以点一波关注或者关注一下我的公众号~
您的支持是我最大的动力!