时间:2021-07-01 10:21:17 帮助过:28人阅读
目录
- <code>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
- 注意,公司核心的业务,建议一台服务?上就跑这一个业务就好了。那此时,最好的做法就是,这
- </code>
agent方案: 适用于 机?多的情况下 (500台)
ssh方案: 适用于机?少的情况下
以磁盘数据为例,分析入库
核心目标:api从数据库中获取老的数据,然后客户端提交过来新的数据,此时,API分析的时候,需要新老数据进行对比
- <code class="language-python">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‘]
- </code>
将数据从数据库中取出来,进行展示
直接替换掉Django自带的admin系统,并提供了很多有用的东西;完全的可扩展的插件支持,基于Twitter Bootstrap的漂亮UI。
20200312 CMDB的磁盘数据查询
标签:import 效率 diff aaa 目录 注意 print else 可扩展