经验分享(3) -- FLASK整合自己的脚本和常用功能 ei(1)

运维久了, 就会写很多脚本, 接触很多工具, 但是太散了. 还有兼容性等, 考虑很多的.

所以我就自己写了个工具 来 整合自己常用的脚本和功能.

项目介绍(需求背景)

项目地址: https://github.com/ddcw/ei 项目包: https://github.com/ddcw/ei/releases/download/ddcw-ei/ddcw-ei-V0.1-20211215.tar.gz

功能介绍:

支持主机实例和数据库实例查看.

(因为本人从事数据库运维工作, 接触得多的就是数据库和操作系统, 经常要看各种数据, 每次登录都很麻烦, 所以才有了这个项目.)

工具栏: 就是自己可能用到的功能, 整合在一起, 在分个类, 用的时候就控制台点一下就行, 很方便.

部署安装: 安装软件跑脚本很方便, 但是还有登录上去,传包之类的很麻烦. 就来了这么个功能. 安装肯定是放后台跑, 所以会有任务列表这种东西.

本文主要是分享怎么实现的. 功能就不仔细介绍了.

项目布局:

略(这不是本文的重点)

用到的技术

前端:

bootstrap5 作为前端界面主要展示布局. 写这个项目的时候bootstrap5出来了, 就用的最新的版本.

jquery-3.1.1 本来没打算用jq的, 但是有部分代码是大学的时候用jq写的, 就整过来了, 主要还是JS实现动态效果.

echart 实现图展示

echarts-liquidfill 动态球展示, CPU内存之类的用个球展示会比较好看一点.

qrcodejs 生成qr二维码, 和本项目关系不大, 觉得可能有用, 就加上了

socketio 实现socket, 有的功能需要实时展示(比如安装过程), socekt就很有必要了

后端:

flask 主要框架.

configparser 读取配置文件参数的

paramiko 远程ssh执行脚本, 拷贝软件包的时候用的.

flask_sockets 实现socket

logging 记录日志

sqlite3 账号信息,数据信息使用sqlite3来保存, 简单点.

pymysql 连接mysql的

cx_Oracle 连接oracle的 #pg和redis和Mongodb的后续也会加上.

flask_apscheduler 任务调度的, 比如定时检查主机实例,数据库实例是否正常

数据库:

sqlite3 这是py内置的库, 本项目并不会有大量的访问, 只要求简单方便, 所以就选了sqlite.

脚本:

主要是shell python其次.

考虑到要兼容很多操作系统, 所以脚本的函数就不加关键字 func/function 布尔判断也不用 [[ 了, 就用单[

不设置tty了, 因为都是远程调用paramiko执行.

注: 为了尽可能的简单方便实用, 就没有用uwsgi gunicorn之类的了, 启动停止都用shell脚本控制.

实现方式参考:

仅供参考.

定时检查实例状态

实用的scheduler.task, 设置的是每隔20秒检查一次数据库实例状态. 如果是用db.session.execute进行实例状态写入数据库的话, 很容易就产生lock. 而且用db.session.commit()提交的话, 还会有 "数据库未打开" 这种报错.

解决办法: 每个定时任务单独实用sqlite3.connect连接. 每次连接完了, 断开就行. 因为使用量不大.sqlite就能抗住了. 整体也很流畅了.

后台执行安装脚本 和 前端实时交互

主要在于 前端请求 "开始安装" 之后, 前端可能会断开. 所以就得使用后台进程了. 比如使用socketio.start_background_task 开启线程去使用paramiko远程连接目标服务器执行脚本. 需要实时返回数据. 这个不难.死循环判断 ssh.exit_status_ready就行, 接受到数据之后就直接通过socket返回前端和写入日志.

但是在循环里面使用 socketio.emit 的话, 并不会马上就返回数据, 而是会等循环完了再返回(也可能是缓存到一定量了再返回), 要实时返回的话, 可以在循环里面加个 socketio.sleep(0.5) 这样就会实时返回了.

@socketio.on 绑定事件

有时候装饰器不起作用, 这时就可以用 socketio.on_event(event_name, function_name,namespace="")来代替了.

删除任务 实时展示

这个其实是最常用的, 实现方式也很多.

本项目的实现方式为: onclick --> function emit(msg) --> 服务端删除任务,并emit(ok), --> 浏览器收到后, 把对应的id 的display设置为None就行.

浏览器发送删除的时候, 也携带了本地(浏览器)监听的事件, 服务器返回的消息就是发给这个事件的. 浏览器的这个事件收到消息后, 设置display 然后弹窗显示成功. 弹窗使用的只是alert, 觉得不好看, 也可以用模态框.

其它的暂时没想到, 以后再说吧. 毕竟这个项目还没把所有功能都实现.

项目展示:

说了这么多, 展示下效果吧. 代码就不放了, 去github上就能看到.

首页

数据库实例

数据库实例详情

主机实例详情

部署安装-->安装单机mysql

任务删除展示(下载和详情就不演示了)

原文地址:https://cloud.tencent.com/developer/article/1919399

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340