Python Django构建简易CMDB
前言
本文仅是对以前写的小示例进行一次梳理和代码优化,由于本人菜鸟一枚,前端,系统运维知识只知皮毛,后端python也没有实际开发经验,在开发过程中也没有考虑堡垒机等一系列服务器的安全措施,都是异想天开的想到哪写到哪,所以存在很多纰漏,还请大家多多海涵。
一、程序功能简介
程序分为cmdb_server,cmdb_client两部分,以运维为核心开发的简易框架。cmdb_client主要负责资产信息采集,采集到数据后将数据进行清洗,汇总。通过POST的方式将数据发给cmdb_server,cmdb_server将接收到的数据写入数据库。通过前端展现给用户。
cmdb_client功能:
1、采集资产信息(目前测试主机Windows 7,centos 7)。
2、对采集的数据进行清洗。
3、将清洗后的数据发给cmdb_server。
cmdb_server功能简介(目前部分功能仅支持centos 7):
1、用户登录认证。
2、将cmdb_client发来的资产信息写入数据库。
3、机房信息维护。
4、业务线信息维护。
5、记录主机资产信息的变更记录。
6、执行用户任务。
7、主机设备,应用监控。
8、远程连接。
9、docker主机管理。
10、KVM主机管理。
11、网络拓扑。
12、PXE网络装机。
13、搜索功能。
14、主机存活扫描。
二、程序目录简介
cmdb_client目录:
[root@cmdb CMDB]# tree -L 2 cmdb_client/ cmdb_client/ ├── bin # 程序启动目录 │ ├── client.py # 程序启动文件 │ └── test.txt ├── conf # 程序配置文件目录 │ ├── cert # 主机标识 │ ├── __init__.py │ ├── __pycache__ │ └── settings.py # 系统默认配置文件 ├── lib # 程序公用文件目录 │ ├── auth.py │ ├── conf # 用户自定义配置 │ ├── convert.py # 数据转换 │ ├── __pycache__ │ ├── responseStructure.py │ └── stringPathToClass.py # 字符串发射类 ├── log │ └── system.log ├── requirements.txt ├── src # 程序功能目录 ├── engine # 数据采集引擎 ├── plugins # 数据采集插件 ├── __pycache__ └── script.py # 执行数据采集
cmdb_server目录:
[root@cmdb CMDB]# tree -L 2 cmdb_server/
cmdb_server/
├── api.py
├── asset_API
│ ├── admin.py
│ ├── apps.py
│ ├── createHostRecode.py # 创建主机记录
│ ├── migrations
│ ├── models.py
│ ├── tests.py
│ ├── updateHostInfo.py # 更新主机记录
│ └── views.py
├── assetRepository
│ ├── admin.py
│ ├── apps.py
│ ├── migrations
│ ├── models.py # 数据模型
│ ├── tests.py
│ └── views.py3
├── cmdb_server
│ ├── __init__.py
│ ├── __pycache__
│ ├── settings.py # 系统配置文件
│ ├── urls.py
│ └── wsgi.py
├── data_dir
│ ├── downloadDir # 存放前端上传的文件的目录
│ ├── __init__.py
│ ├── kickstart_config # 装机脚本文件目录
│ └── logDir # 日志目录
├── db.sqlite3
├── interactive.py
├── manage.py
├── plugin
│ ├── alarmHandling.py # 邮件报警
│ ├── encryption.py # MD5加密
│ ├── Excel.py
│ ├── exceptionHandling.py # 异常处理
│ ├── hostScan.py # 主机存活扫描
│ ├── log.py # 日志模块
│ ├── pagination.py # 分页模块
│ ├── preprocessing.py # 告警处理
│ ├── public.py # 公共通用类
│ └── SSH.py # SSH处理模块
├── show_page
│ ├── account_settings # 用户设置
│ ├── alarm_event # 告警事件
│ ├── client_manage # 主机资产管理
│ ├── docker_manage # docker主机管理
│ ├── host_app_monitor # 主机应用监控管理
│ ├── kickstart # PXE网络装机
│ ├── kvm_manage # KVM主机管理
│ ├── login_register # 登录认证管理
│ ├── network_topology # 网络拓扑管理
│ ├── remote_connect # 远程连接管理
│ ├── user_task # 执行用户任务
│ ├── vnc_connect # VNC 远程连接
│ └── web # web app
三、程序开发平台
操作系统:centos 7
软件版本:python 3.6 django 1.11.20 mariadb 5.5.64
主要用到的技术:python,django,SSH,websocket,ajax,JS。需要用到的运维命令及众多模块。
四、程序执行流程
SSH模式:
使用agent模式:
SSH对比agent
方便管理:SSH模式只需要将cmdb_client程序放在一台主机即可获得所有主机资产信息,agent模式需要将cmdb_client程序放到所有主机上。
易于维护:当cmdb_client内容发生改变时,SSH模式只需要修改cmdb_client主机的程序即可,agent模式需要将修改后的cmdb_client程序重新发给每台主机。
运行效率:SSH模式需要通过SSH的方式连接每一台主机,会受网络,服务器对SSH远程连接的处理等因素影响效率不是很高,agent模式则是在本地获取数据后直接使用request.POST将数据发给cmdb_server,没有远程登录认证的过程,因此在效率上要比SSH模式快。
安全性:SSH模式需要登录到目标主机上,这个过程可能被抓包抓取到登录凭证或者主机被黑客入侵程序中的登录认证等敏感信息将被窃取,存在一定安全隐患,agent模式的程序中没有登录认证等敏感数据,因此在安全上要好于SSH模式。
程序实现思路:
cmdb_client的SSH模式:
cmdb_client的agent模式:
cmdb_server:
五、功能简述
1、登录认证模块
1.1 登录认证模块
该模块实现的比较简单,目前只实现了简单的登录认证功能,没有对注册邮箱,密码复杂度等进行效验,注册成功后,使用邮箱进行登录,需要注意的是这里进行了用户登录限制,一个账号只能在一台电脑上进行登录,如果想要在其它电脑登录同一账号,需要先注销登录后,才可以在其它电脑进行登录,否则无法进行登录。
1.2 账户设置
该模块主要是对用户账号,密码,头像等信息进行编辑修改,同时用户可以上传自己喜欢的个性头像来作为自己的头像,目前没有对上传头像的尺寸进行校验,所以可能会出现由于上传头像图片太大,导致显示不全的问题。
2、资产信息模块
该模块主要用于将获取到的资产信息存储到数据库当中,通过前端页面将主机资产信息以更加友好的形式展现给用户。
主机资产信息来源有三种方式:
- 从cmdb_client采集到的数据获取主机资产信息。
- 用户通过Excel导入的资产信息。
- 手动添加资产信息。
2.1 client将采集到的数据发给server
client端通过SSH|agent|snmp的方式获取主机资产信息,然后对获取到的资产信息进行清洗,整理。通过request模块将主机资产信息发给server端。server接收到资产信息后,根据标识来确定是创建主机记录还是更新主机记录,如果是更新主机记录,此时还会将更新的数据写入主机的变更记录表中,用于记录主机资产信息发生的变化。
2.2 使用Excel的方式导入主机资产信息
这里需要注意:在导入资产信息时需要和数据库中字段相对应,所以导入的Excel是有一定格式的,为了方便我将导入和导出设置成相同的格式,所以用户想要使用Excel导入数据时,先导出一份主机记录作为导入的模板。这种方式导入的资产信息是以创建主机记录的方式插入到数据库的资产表中,而资产表中的主机名是唯一的,所以如果导入的资产信息主机名有重复或者和数据库中资产信息表的主机名字段重复讲导致插入失败。如下:
2.3 手动添加资产信息
由于手动添加资产信息其本质和使用Excel导入的方式一致,所以这里不再赘述。
注:资产信息当中还包含主机有哪些服务,以及服务的相关信息,关于主机有哪些服务必须手动进行添加,无法通过程序自动化实现。
3、资产信息管理模块
资产信息管理模块包含资产信息管理,机房信息管理,业务线信息管理三个子模块。
3.1 资产信息管理功能
资产信息管理主要是对主机资产信息进行修改,查询,删除等,如下操作:
主机应用管理,记录主机上都有哪些应用,服务的启动方式,安装路径,端口号等,需要手动维护。
资产信息的导入和导出的Excel样式如下:
3.2 机房信息管理
该模块主要记录主机在哪个机房,哪个机柜及机房联系人,当服务器发生问题时,可以迅速的找到相关人员及物理主机。
3.3 业务线管理
该模块主要用于记录主机的用途及该主机的业务负责人,当该业务出现问题时可以迅速找到相关负责人。
4、主机变更记录模块
主机变更记录模块只有通过client发送过来的资产信息当中带有update更新标记时才会被记录到变更记录表中,关于资产的变更时间可能与实际硬件发生改变的日期时间不符,因为client是定时采集数据的,会存在空档期,所以主机变更记录日期时间其实就是client采集资产信息的日期,而不是真正更换硬件的日期时间。手动添加资产信息,Excel导入资产信息都是以创建新的主机记录的模式将主机资产信息写入数据库,不存在更新一说。
5、用户任务模块
该模块主要包含:
- 批量执行命令。
- 批量文件下发。
- 批量执行脚本文件。
- 文件提取。
5.1 批量执行命令:主要用于执行批量安装命令,目前仅允许rpm,yum,tar命令的执行,其它命令未放行。
5.2 批量执行脚本:对被选中的主机执行脚本。
5.3 批量文件下发:将文件下发到被选中的主机中。
5.4 文件提取:选择一台主机将其文件下载到本地。
6、远程连接
远程连接有两种方式:SSH,VNC。SSH模式目前仅支持用户名密码的方式建立连接,VNC模式是借助的noVNC模块来实现的。
6.1 使用SSH的方式连接主机
该实现是通过python,django,前端xterm实现的webssh,目前仅支持用户名密码的验证方式,功能比较简单。演示如下:
6.2 使用VNC连接远程主机
该实现是通过python,django,noVNC模块来实现的VNC远程连接功能。演示如下:
7、主机监控模块
主机监控分为实时查看和后台监控两种模式。
实时监控:只是方便用户直观查看,当监控项超过用户设定的阈值或者应用无法访问时不会发送报警邮件,只是直观的在页面展示。
后台监控:当监控项超过用户设定的阈值或者服务无法访问时会根据用户设定的监控时间每隔一段时间向用户发送报警邮件。
监控项分为硬件监控,应用监控。
硬件监控:这一部分会包含登录信息(SSH模式有数据,SNMP模式没有数据),内存,硬盘,CPU,网卡流量,用户可以设置内存,硬盘,CPU的报警阈值,当监控项达到报警阈值时会发送报警邮件。
应用监控:主要监控应用是否可以访问。
监控方式分为SSH模式,SNMP模式。
SSH模式:该模式需要与被监控端建立SSH连接,通过SSH的方式获取数据,该模式会获取到登录信息,网卡流量。监测也相对准确,缺点就是不安全,但数据准确,被控端不需要任何设置。
SNMP模式:该模式优点在于不需要连接认证,相对来说更加安全,获取速度快,但被控端需要修改SNMP的配置文件,在获取网卡流量时可能也不是特别准。
使用SNMP模式监控效果如下:
使用SSH模式监控主机效果如下:
历史记录查询:
8、docker管理模块
docker管理模块分docker主机管理和docker服务及容器管理两个部分。
docker主机管理
该模块主要是用于管理服务端与docker主机的连接信息及辅助功能,连接信息主要包含docker主机的IP,用户名,密码,SSH端口等信息,辅助功能包含批量安装docker,批量更新镜像源,镜像搜索,批量镜像下载,批量安装容器。
批量安装docker:该功能首先获取需要安装的docker版本,然后根据docker版本进行批量安装。
批量更新镜像源:该功能主要是用于统一各主机的镜像下载源,方便统一管理。
镜像搜索:该功能主要是搜索当前镜像源下的可用镜像。
批量镜像下载:该功能主要实现了为各主机下载统一的镜像,为批量安装容器创造条件。
批量安装容器:该功能主要实现了批量安装容器的功能。
容器管理
容器管理分为docker服务管理,容器管理,镜像管理,dockerfile。
docker服务管理:docker服务的开启,停止,重启,开机启动,禁止开机启动。
容器管理:开启,停止,重启,查看容器日志,删除容器。
镜像管理:查看镜像详情,删除镜像。
dockerfile:根据dockerfile构建容器。
下面展示动画都是第一版的,目前版本的程序此功能没有什么变化所以就用第一版的演示吧。
8.1 批量安装docker
8.2 统一镜像源
8.3 镜像搜索和批量下载
8.4 批量创建容器
8.5 docker服务,容器,镜像相关操作
8.6 使用dockerfile创建镜像
9、KVM管理模块
KVM管理模块分KVM主机管理和虚拟机管理两部分。
9.1 KVM主机管理
该部分主要包含了连接信息管理,批量安装KVM,批量创建虚拟机三个功能。
连接信息管理:主要包含了kvm宿主机的连接信息(IP,用户名,密码,端口等必填信息)。
批量安装KVM:实现在各主机上批量安装KVM。
批量创建虚拟机:创建虚拟机目前支持使用ISO镜像和母版两种方式,当使用ISO的方式创建虚拟机时则不能实现批量安装,因为它涉及到交互,所以只能为单台主机创建虚拟机,通过VNC进行交互。使用母版qcow2的方式可以实现批量安装虚拟机的功能,因为此种方式不需要交互,但需要用户提前创建好母版。
9.2 KVM虚拟机管理
该部分主要涉及KVM服务管理,虚拟机管理。
kvm服务管理:开启,停止,重启,开机启动,禁止开机启动。
虚拟机管理:开启,停止,重启虚拟机,删除虚拟机。注意:在停止虚拟机和重启虚拟机时这里使用的是粗暴的做法,那就是通过destroy强行停止虚拟机而不是通过shutdown来停止虚拟机,因为shutdown是通过发送acpi指令来控制虚拟机的电源,而KVM虚拟机安装linux系统时默认没有安装acpi服务,反以导致不能关闭虚拟机,需要安装acpi。关于这部分以后待优化。删除虚拟机时只是删除了虚拟机,但没有删除虚拟机对应的磁盘文件,需用户手动清理。
提示:当在kvm主机管理页面点击kvm管理时,服务端会到kvm主机上创建ping脚本,建立ARP缓存用于获取kvm主机的IP地址,该方法会给kvm主机造成一定的压力,因为建立ARP缓存需要通过脚本ping整个网段,而脚本使用的是多线程所以会占用kvm服务器的资源。
下面通过ISO的方式进行简单安装演示:
安装完成后进入虚拟机管理界面我们会看到如下:
10、网络拓扑管理
该模块是通过python和前端实现的网络拓扑功能,可以实现保存拓扑,载入拓扑,监控拓扑,停止监控,将拓扑导出成图片等基本的网络拓扑功能。关于保存拓扑目前仅支持保存一份拓扑,新保存的拓扑会覆盖原有的拓扑,所以需要注意。拓扑目前实现了简单的监控功能,当检测到一个拓扑节点发生故障后,便不会对该故障节点后续节点进行检测,而是对该故障节点进行告警,故障节点后侧的设备保持原有状态,演示功能如下:
11、PXE网络装机
关于PXE网络装机这里就不过多解释了,网络上有好多介绍。我只不过是把所有的步骤都通过python脚本来实现了而已。主要是通过python和kickstart实现的PXE网络装机。用户只需在前端填写必要的选项,然后点击开始安装即可,在填写参数时需要注意如果主机有两块网卡还好,主机的一块网卡作为server端的服务器地址,另一块网卡作为pxe客户端的网关地址这样是没有问题的,因为我们安装完系统后,需要恢复应用和网卡的配置使其能像以前一样继续它们的工作,这时我们只需填写网卡名称,点击恢复配置文件即可进行恢复。如果主机只有一块网卡,那么建议把dhcp网关的IP地址设置成和cmdb_server是一样的地址,如果你把DHCP网关地址设置成其它地址,那么pxe装机脚本在修改网卡配置后,导致cmdb_server无法正常运行,因为cmdb_server监听的IP地址已经不存在了,此时虽然可以正常的实现PXE网络装机功能,但是需要手动恢复原来的配置文件,其它配置文件可以不管,至少需要手动修改网卡配置文件才可以正常使用网络。下面以centos 7 演示为例。
为了方便,我就没有上传ks文件,程序支持用户上传自己设计好的ks文件,如果用户没有上传ks文件,程序会使用默认的ks文件,这里使用程序提供的默认ks文件主要是为了方便些。
12、搜索模块
搜索功能目前主要是针对IP地址或者业务线进行搜索,在搜索时可以根据条件进行搜索,并且会跳转到条件所在的模块。注意:当用户在机房信息模块,业务线模块,变更记录模块进行搜索时,都会跳转到资产信息模块,其它模块搜索IP时都是在对应的模块内进行搜索。还有一点要注意,搜索框是接收两次回车按钮的,第一次用于选取用户的条件,第二次执行搜索功能。
简单演示:
13、主机存活检测模块
该模块主要是由前端发起,前端通过ajax的方式每隔10秒向后端发起一次请求获取当前页面的主机状态,效果如下:
本程序仅是自娱自乐,目前仅在虚拟环境下进行了简单的测试,程序的健壮性和功能待完善。如果您有什么想法或者建议,欢迎留言!!!
目前代码没有发布(因为太烂,不好意思发),代码目前利用闲暇时间正在整理完善中。。。
技术交流群419507716,群里目前没人,喜欢交流技术的小伙伴们可以加入哈哈。