20200312 CMDB的磁盘数据查询
昨日回顾
1. 异常处理(健壮性)
try:
int('aaa')
except Exception as e:
print(e) # 错误信息比较的少
使用traceback模块,获取更详细的错误信息
2. 提升ssh类方案下采集效率
线程与进程的区别
线程池的使用
from concurent.futures import TheadpollExecute
p = TheadpollExecute(10)
p.submit(task, i)
3. 数据表的设计
遵循的大原则,表中的字段的设计一定是和客户端的传来的字段要一致
表和表的关系(一对一,一对多,多对多)
面试的时候,主要的套路就是 : 项目 + 基础python技术点 + mysql + redis
注意,公司核心的业务,建议一台服务器上就跑这一个业务就好了。那此时,最好的做法就是,这
agent方案: 适用于 机器多的情况下 (500台)
ssh方案: 适用于机器少的情况下
CMDB
数据入库
以磁盘数据为例,分析入库
核心目标:api从数据库中获取老的数据,然后客户端提交过来新的数据,此时,API分析的时候,需要新老数据进行对比
from django.shortcuts import render, HttpResponse, redirect
# Create your views here.
import json
from repository import models
def asset(request):
if request.method == 'POST':
new_server_info = json.loads(request.body)
# 判断状态码是否为1000
# 1.判断主机名知否合法
hostname = new_server_info['basic']['data']['hostname']
server_obj = models.Server.objects.filter(hostname = hostname).first()
if not server_obj:
return HttpResponse('主机名未被提前录入,非法数据')
# 分析磁盘数据为例
# disk采集出错,保存信息
status = new_server_info['disk']['status']
if status != 10000:
# title= 标题 content= 报错信息 asset_obj = 外键(出错的服务器)
models.ErrorLog.objects.create(title='%s采集出错'%hostname,content=new_server_info['disk']['data'],asset_obj=server_obj)
return HttpResponse('采集出错')
# 增加的磁盘slot
new_disk_info = new_server_info['disk']['data']
new_slot = set(new_disk_info.keys()) # 获取所有的key [1,2,3,4,5 ]
# 获取数据库中旧的数据
old_slot = []
# 查询数据库中的当前主机对象对应的disk数据
old_disk_info = models.Disk.objects.filter(server_obj=server_obj)
# 获取旧的obj
for obj in old_disk_info:
old_slot.append(obj.slot) # 旧的磁盘数据的值
# 增加slot对应的磁盘数据
# difference集合求差集 [0,1,2,3] - [2,3,5] = {0,1}
add_slot = set(new_slot).difference(set(old_slot))
if add_slot:
for slot in add_slot:
add_disk_info = new_disk_info[slot]
# 添加外键字段,然后再使用**打散数据
add_disk_info['server_obj'] = server_obj
models.Disk.objects.create(**add_disk_info)
# 删除
# 查看新获取的数据,和数据库中的数据. 将旧的数据库中多的删除,就同步了新获取数据
del_slot = set(old_slot).difference(set(new_slot))
if del_slot:
models.Disk.objects.filter(server_obj=server_obj,slot__in =del_slot).delete()
# 更新(求交集)
updata_slot = set(old_slot).intersection(set(new_slot))
if updata_slot:
for slot in updata_slot:
old_disk_row = models.Disk.objects.filter(server_obj=server_obj, slot=slot).first()
new_disk_row = new_disk_info[slot]
# 判断新老数据是否变化
for k, new_v in new_disk_row.items():
# 利用反射获取old_disk_row中的v值
old_v = getattr(old_disk_row, k)
# 判断旧的与新的v值的不同(不同就需要更新)
if new_v != old_v:
setattr(old_disk_row, k, new_v)
old_disk_row.save()
return HttpResponse('ok')
else:
# 需要连接数据库,获取主机列表
return ['c1.com','c2.com']
展示
将数据从数据库中取出来,进行展示
- 前后端分离
- Vue + drf
- 前后端不分离
- Django中的模板
- xadmin
xadmin
直接替换掉Django自带的admin系统,并提供了很多有用的东西;完全的可扩展的插件支持,基于Twitter Bootstrap的漂亮UI。