zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    jquery中的Ajax
    javascript 中状态改变触发事件
    关于sql 资源竞争死锁现象
    Attribute 特性
    JavaScript的垃圾回收
    委托和事件
    彻底弄懂AngularJS中的transclusion
    理解AngularJS中的依赖注入
    用postal.js在AngularJS中实现订阅发布消息
    AngularJS 1.3中的一次性数据绑定(one-time bindings)
  • 原文地址:https://www.cnblogs.com/fwzzz/p/12734034.html
Copyright © 2011-2022 走看看