用 Python 造了个运维小小弟,运维的活就交给我了

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,,版权归原作者所有,如有问题请及时联系我们以作处理

作者:somenzz

原文链接:https://cloud.tencent.com/developer/article/1758817

周六,正和家人在外边玩得起劲,突然接收到微信报警,某某系统供数出错……

此时,内心是崩溃的,有一万个羊驼在翻腾,我能瞬间说出这系统的 100 个缺陷。

然而,也有另外一个声音在耳边提醒着:抱怨是最没用的,可怜之人必有可恨之处,老板在乎不是你的苦劳,而是你的功劳。

算了,回家打开电脑,解决报错。

以上的场景做过运维的朋友想必比较熟悉,没做过运维的人相信也有类似的经历,总之就是那些让你不爽的事,如果这些不爽的事与电脑有关,不妨继续一看。

痛定思痛,我再也不愿意做如此重复又没技术含量的杂事了,今天必须拿出一个方案来。

向领导说不干这个了
换系统
自己想办法解决
俗话说三思而后行,常言道换位思考,当今互联网时代更要学会产品思维。
假如我是客户,我会喜欢什么样的产品呢?肯定是有问题会自我修复的产品,如果确实无法自我修复,应该提示我升级或找售后维护,如果拒绝服务却又没有任何信息提示,那么这个产品只好废弃不用了。作为一名员工,其实也是领导的一款产品,需要提高自己的核心竞争力,做别人不愿做或做别人做不好的事,这样才能体现自己的价值。这样想,心情平静了许多。

那么,我选择先做 3 。

分析问题:这个属于系统 bug,上传失败通过在网页上再点一次上传按钮就可以传成功。

不如干脆造个运维小小弟在报错的时候自动帮我点下得了!想到这里,我被自己想法折服了,这个还真可以实现,找当今稳排第一的编程语言 Python 来实现这个小小弟就成了,毕竟还是打过交道的,应该没有大问题。

有想法就要有行动,just do it。

思路:我需要的是一个可以在网页上自动操作的小小弟,因此先分析网页 Web 请求,再选取相应的工具,最后编码调试。

第一步 分析网页。网站是需要登陆的,打开 Chrome 浏览器,输入用户名和密码,按 F12 /或 Ctrl + Shift + I 打开开发者工具 ,勾选以下选项。

再点击登陆按钮,然后查看开发者工具的网络请求记录。

发现这一步为 POST 请求,参数中出现了刚才输入用户名密码,这里未加密,有些网站密码可能通过JavaScript 对密码进行了加密后上传至服务器的,此时则需要使用加密后的密码提交 Post 请求。查看其 ResPonse 如下:

发现返回值是 Json 格式的字符串,有个 methodName 为 login,参数也是刚才输入的用户名密码,更进一步说明,这一请求就是验证登陆用户是否合法的。

第二步 选取工具。这里涉及到爬虫,我熟悉的爬虫工具有 urllib(标准库),requests(第三方库),selenium(第三方库),
urllib 比较简单,实现 Session 有点麻烦;selenium 太笨重,虽然可以运行 JavaScript,但是需要浏览器驱动,找各种元素的 xpath,运行起来也很慢;而 requests 库就非常 Pythonnic ,简单而优雅,能轻松处理 Session ,这也是我的最爱用的工具。
于是选定 requests 先做一个登陆验证。

第三步 编码调试。由于页面需要登陆,因此需要保留与服务器通讯的会话 Session。
登陆的代码如下:

import requestss = requests.Session()url = 'http://xxx.xxx.xxx.xxx:9080/******/vision/RMIServlet'data = { 'className': 'UserService', 'methodName': 'login', 'params': '['admin','******']',}r = s.post(url, data=data)print(r.text)print(r.status_code)

执行结果为

{'retCode':0,'result':true}200

返回 200 说明访问成功,小兴奋了一把。接着,同样的方法我点击供数配置菜单,得到供数的页面,继续分析。

点击供数配置时的请求

点击供数配置后的应答

发现其返回了跳转页面的参数,我们获取该参数,继续请求即可,对应的代码如下:

import requestsimport jsons = requests.Session()url = 'http://xxx.xxx.xxx.xxx:9080/******/vision/RMIServlet'data = {'className': 'UserService','methodName': 'login','params': '['admin','******']',}r = s.post(url, data=data)print(r.text)print(r.status_code)data2 = { 'className': 'UrlLinkService', 'methodName': 'getURLLink', 'params': '['I8ae3cd903146dcb1013146df075c000c']',}r2 = s.post(url, data=data2)print('获取供数配置页面参数信息',r2.status_code)result = json.loads(r2.text) # 将Json 字符串转化为 Python 字典print(result['result']['url']) # 获取 url 参数

运行结果如下:

{'retCode':0,'result':true}200获取供数配置页面参数信息 200/bioffice/vision/SupplyManagement?opFlg=querySysCfgTask&forwardPage=list.jsp

接下来,点击我们要处理的系统名称,再点击详细信息,找到重新上传按钮,注意每一步的 Post 或 Get 请求,道理都是通的,编写相应的 Post 或 Get 代码即可。
完整代码如下所示:

import requestsimport jsons = requests.Session()url = 'http://xxx.xxx.xxx.xxx:9080/******/vision/RMIServlet'data = {'className': 'UserService','methodName': 'login','params': '['admin','******']',}r = s.post(url, data=data)print(r.text)print(r.status_code)data2 = {'className': 'UrlLinkService','methodName': 'getURLLink','params': '['I8ae3cd903146dcb1013146df075c000c']',}r2 = s.post(url, data=data2)print('获取供数配置页面参数信息',r2.status_code)result = json.loads(r2.text) # 将Json 字符串转化为 Python 字典print(result['result']['url']) # 获取 url 参数url3 = f'http://xxx.xxx.xxx.xxx:9080{result['result']['url']}'#print(url3)r3 = s.get(url3)print(r3.url, r3.status_code)taskinfo = ['988909',CRM.DJJGXCKMX','2018-08-19','CRM'] #实际使用时可做为参数传入payload0 = { 'opFlg': 'queryTask', 'forwardPage': 'listtask.jsp', 'sysid': taskinfo[3], 'sysname': '', 'rundate': taskinfo[2],}payload1 = { 'opFlg': 'modifyTask', 'forwardPage': 'listtask.jsp', 'flg': 'U', 'sid': taskinfo[0], 'vname': taskinfo[1], 'rundate': taskinfo[2],}r4 = s.get( 'http://xxx.xxx.xxx.xxx:9080/******/vision/SupplyManagement', params=payload0)r5 = s.get( 'http://xxx.xxx.xxx.xxx:9080/******/vision/SupplyManagement', params=payload1)print(r4.url, r4.status_code)print(r5.url, r5.status_code)if r5.status_code == 200: print('已执行上传')else: print('执行上传失败')

测试环境验证:
执行前:

原本运行结束时间为 2018-08-20 05:37:11
执行上述代码,打印信息如下:

{'retCode':0,'result':true}200获取供数配置页面参数信息 200/bioffice/vision/SupplyManagement?opFlg=querySysCfgTask&forwardPage=list.jsphttp://xxx.xxx.xxx.xxx:9080/******/vision/SupplyManagement/list.jsp 200http://xxx.xxx.xxx.xxx:9080/******/vision/SupplyManagement/listtask.jsp 200http://xxx.xxx.xxx.xxx:9080/******/vision/SupplyManagement/listtask.jsp 200已执行上传

再次查看运行结束时间为2018-08-20 22:47:39

说明这个小小弟已经成功的为我执行了重新上传的任务,后续可监控的报警信息传递给这个小小弟,小小弟就可以在生产环境自动帮我处理上传失败的问题了。

总结:只要思想不滑坡,办法总比困难多。上面分享的这些,对于懂 http 协议的人来说简单地就像老戏骨看小娃娃表演一般,所以起名叫小小弟,他的功能还是非常简单的,但是把这些技术用于解决实际的运维问题我认为还是比较有意义的,具有自动修复功能的运维才是真正的自动化运维。后续会逐步加强小小弟的功能。

(0)

相关推荐

  • 接口自动化测试利器——Requests

    Python中,系统自带的urllib和urllib2都提供了功能强大的HTTP支持,但是API接口确实太难用了.Requests 作为更高一层的封装,在大部分情况下对得起它的slogan--HTTP ...

  • python接口自动化8-参数化

    前言 前面一篇实现了参数的关联,那种只是记流水账的完成功能,不便于维护,也没什么可读性,接下来这篇可以把每一个动作写成一个函数,这样更方便了. 参数化的思维只需记住一点:不要写死! 一.登录函数 1. ...

  • python接口自动化7-参数关联

    前言 我们用自动化发帖之后,要想接着对这篇帖子操作,那就需要用参数关联了,发帖之后会有一个帖子的id,获取到这个id,继续操作传这个帖子id就可以了 一.删除草稿箱 1.我们前面讲过登录后保存草稿箱, ...

  • 奥维小技巧 | 奥维地图的这些宝藏功能你用过吗?

    前言 对于奥维地图这个老朋友,想必大家都和他相处已久了吧!平时我们使用最多的一是地图的浏览功能,二是奥维的定位与收藏夹功能. 但是,对于以下几个宝藏功能,你真的发现并使用过吗? (营地君使用奥维近四年 ...

  • 嘘,Python 优化提速的 8 个小技巧

    作者:张皓 链接:https://zhuanlan.zhihu.com/p/143052860 Python 是一种脚本语言,相比 C/C++ 这样的编译语言,在效率和性能方面存在一些不足.但是,有很 ...

  • 软件小讲堂 | 二维转三维,巧用GH完成数据可视化处理

    HELLO小伙伴们,又到了每周一次的软件小讲堂. 随着软件的更新,数据处理的门槛也变得越来越低.以往对于建筑师而言困难重重的数据可视化,现在在类似于GH之类的平台上做起来已经变得非常轻松了.但如今相较 ...

  • Python 优化提速的 8 个小技巧

    Python 是一种脚本语言,相比 C/C 这样的编译语言,在效率和性能方面存在一些不足.但是,有很多时候,Python 的效率并没有想象中的那么夸张.本文对一些 Python 代码加速运行的技巧进行 ...

  • Python自动安装第三方库的小技巧,让你的代码拿来就用

    大家好,我是Python之眼. 最近周末也加班了,害...... 有刚接触python的粉丝同学在运行此前<Python爬虫> | 手把手教你扒一扒贝壳网成交房源数据>的完整代码遇到 ...

  • 手机运镜篇 | 简单好学的运镜小技巧,让你的视频秒变大片

    小鱼经常收到鱼粉私聊,手机稳定器要怎样运镜才能拍出好看的视频?今天小鱼来给你支支招,周末出去玩用上这几种运镜,轻松拍出惊艳酷炫大片!01街景拍摄三种运镜(上)周末和朋友去逛街,如何拍出街拍时尚范?除了 ...

  • Python简单通俗易懂的贪吃蛇小游戏,儿时童年的味道!

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 今天,给大家介绍一个简单易懂的贪吃蛇小游戏 代码 如下 import pygame,sys, ...

  • 理解Python多线程:通过易懂的小例子展开

    4天前 1 默认启动主线程 一般的,程序默认执行只在一个线程,这个线程称为主线程,例子演示如下: 导入线程相关的模块 threading: import threading threading的类方法 ...

  • 稳定器十个运镜小技巧,器材拉杆箱推荐

    稳定器十个运镜小技巧,器材拉杆箱推荐