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。

posted @ 2020-04-19 21:59  fwzzz  阅读(136)  评论(0编辑  收藏  举报