简易的CMDB服务端

Posted id_iot

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简易的CMDB服务端相关的知识,希望对你有一定的参考价值。

前言

本文仅是对以前写的小示例进行一次梳理,由于本人菜鸟一枚,后端代码写的很渣,前端页面也不好看,没有考虑堡垒机等一些安全措施,也没有运维经验,所以存在很多纰漏,还请大家多多海涵。

一、程序功能简介

程序分为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发来的资产信息写入数据库。

      2.1 将数据库中的资产信息展示到前端页面。

      2.2 将主机资产信息导出成Excel格式。

      2.3 将Excel格式的资产信息导入到数据库。

3、机房信息维护。

4、业务线信息维护。

5、记录主机资产信息的变更记录。

6、执行用户任务(批量执行命令,执行脚本,文件下发。提取客户端文件到本地)

7、主机硬件,应用监控(邮件报警功能)。

8、远程连接(webshell和VNC)。

9、docker主机管理。

10、KVM主机管理。

11、搜索功能。

12、主机存活扫描。

二、程序目录简介

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/
├── asset_API                # 接收cmdb_client发来的资产信息,将其写入数据库
│   ├── admin.py
│   ├── apps.py
│   ├── createHostRecode.py  # 在数据库中创建资产记录
│   ├── __init__.py
│   ├── migrations
│   ├── models.py
│   ├── __pycache__
│   ├── tests.py
│   ├── updateHostInfo.py    # 在数据库中更新主机记录
│   └── views.py             # 视图函数,接收客户端发来的资产信息
├── assetRepository          # 存放数据库
│   ├── admin.py
│   ├── apps.py
│   ├── __init__.py
│   ├── migrations
│   ├── models.py            # 数据库model
│   ├── __pycache__
│   ├── tests.py
│   └── views.py
├── cmdb_server              # 程序主目录
│   ├── __init__.py
│   ├── __pycache__
│   ├── settings.py          # 程序配置文件
│   ├── urls.py              # 主路由
│   └── wsgi.py
├── data_dir                 # 数据目录
│   ├── downloadDir          # 文件中转目录
│   ├── __init__.py
│   └── logDir               # 存放日志文件
├── db.sqlite3
├── manage.py
├── plugin                   # 插件库
│   ├── alarmHandling.py     # 邮件报警
│   ├── encryption.py        # 加密
│   ├── Excel.py             # Excel模块
│   ├── exceptionHandling.py # 异常处理模块
│   ├── hostScan.py          # 主机存活扫描模块
│   ├── __init__.py
│   ├── log.py               # 日志模块
│   ├── pagination.py        # 分页模块
│   ├── public.py            # 公共类
│   ├── __pycache__
│   └── SSH.py               # SSH任务处理模块
├── requirements.txt
├── show_page                # 功能实现目录
│   ├── client_manage        # 资产信息展示
│   ├── docker_manage        # docker主机管理
│   ├── host_app_monitor     # 主机监控
│   ├── __init__.py
│   ├── kvm_manage           # KVM主机管理
│   ├── login_register       # 登录认证
│   ├── __pycache__
│   ├── remote_connect       # 远程连接
│   ├── user_task            # 执行用户任务
│   ├── vnc_connect          # 建立VNC连接
│   ├── web                  # 功能类

三、程序开发平台

操作系统: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、登录认证模块

该模块目前只实现了简单的登录认证功能,没有对注册邮箱,密码复杂度等进行效验,注册成功后,使用邮箱进行登录。用户只能在一台电脑上进行登录,如果希望在其它地方登录需要先退出账号在进行登录。

否则会提示如下内容:

登录成功后你会看到如下:

2、获取资产信息模块

获取资产信息的方式有三种:cmdb_client采集后发来的数据,用户通过Excel导入的资产信息,手动添加资产信息。

2.1 cmdb_client通过SSH或者agent的方式采集主机的资产信息:通过request模块将主机资产信息发给cmdb_server端,cmdb_server接收到数据后,根据标识以创建主机记录或者更新主机记录的方式将数据存入数据库。当接到的数据以更新的方式更新到数据库时,同时还会将更新的数据写入主机的表更记录表,用于记录主机资产信息发生的变化。

2.2 使用Excel的方式导入主机资产信息:这里需要注意:由于需要和数据库中字段相对应,所以导入的Excel是有一定格式的,为了方便我将导入和导出设置成相同的格式,所以用户想要使用Excel导入数据时,先导出一份主机记录作为导入的模板。这种方式导入的资产信息是以创建主机记录的方式插入到数据库的资产表中,而资产表中的主机名是唯一的,所以如果导入的资产信息主机名有重复或者和数据库中资产信息表的主机名字段重复讲导致插入失败。如下:

2.3 手动添加资产信息其本质和使用Excel导入的方式一致,所以这里不再赘述。

3、资产信息管理模块

资产信息管理模块包含资产信息管理,机房信息管理,业务线信息管理三个子模块。

3.1 资产信息管理功能如下:

     3.1.1 资产信息的增,删,改,查。

     3.1.2 主机应用,记录主机上都有哪些应用,需要手动维护。

      3.1.3 资产信息的导入和导出。

导入和导出的Excel样式如下:

3.2 机房信息管理:该模块主要记录机房信息及当发生问题时的机房联系人员。

3.3 业务线管理:该模块主要用于标识主机的用途及该主机的负责人。

4、主机变更记录模块

主机变更记录模块只有通过cmdb_client发送过来的资产信息当中带有update更新标记的主机才会被记录到变更记录表中,关于资产的变更时间可能与实际硬件发生改变的日期不符,因为cmdb_client是定时采集数据的,存在空档期,所以主机变更记录日期其实就是cmdb_client采集资产信息的日期。手动添加资产信息,Excel导入资产信息都是以创建新的主机记录的模式将主机资产信息写入数据库,不存在更新一说。

5、用户任务模块

该模块主要包含:批量执行命令,批量文件下发,批量执行脚本文件,文件提取。

5.1 批量执行命令:主要用于执行批量安装命令,目前仅允许rpm,yum,tar命令的执行,其它命令未放行。

5.2 批量执行脚本:该功能首先将脚本上传到服务器,由服务器将脚本下发到其它主机并执行该脚本。

5.3 批量文件下发:该功能先将文件上传到服务器,由服务器将文件下发给其它主机。

5.4 文件提取:选择一台主机将其文件拷贝到本地,过程也是先将文件拷贝到服务器,由服务端将文件发给前端。

6、远程连接

远程连接有两种方式:SSH,VNC。SSH模式目前仅支持用户名密码的方式建立连接,VNC模式是借助的noVNC模块来实现的。

6.1 使用SSH的方式连接主机

6.2 使用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、搜索模块

搜索功能目前主要是针对IP地址或者业务线进行搜索,在搜索时可以根据条件进行搜索,并且会跳转到条件所在的模块。注意:当用户在机房信息模块,业务线模块,变更记录模块进行搜索时,都会跳转到资产信息模块,其它模块搜索IP时都是在对应的模块内进行搜索。还有一点要注意,搜索框是接收两次回车按钮的,第一次用于选取用户的条件,第二次执行搜索功能。

简单演示:

11、主机存活检测模块

该模块主要是由前端发起,前端通过ajax的方式每隔10秒向后端发起一次请求获取当前页面的主机状态,效果如下:

 

本程序仅是自娱自乐,目前仅在虚拟环境下进行了简单的测试,程序的健壮性和功能待完善。如果您有什么想法或者建议,欢迎留言!!!

 

以上是关于简易的CMDB服务端的主要内容,如果未能解决你的问题,请参考以下文章

20200311 CMDB的表设计

20200310 CMDB基础设计

国庆假期之CMDB管理系统

cmdb面试题

next.js简易入门

基于socket简易版客户端,服务端交互