当前位置:Gxlcms > 数据库问题 > 20200312 CMDB的磁盘数据查询

20200312 CMDB的磁盘数据查询

时间:2021-07-01 10:21:17 帮助过:28人阅读

目录

  • 昨日回顾
  • CMDB
    • 数据入库
    • 展示
      • xadmin

昨日回顾

  1. <code>1. 异常处理(健壮性)
  2. try:
  3. int(‘aaa‘)
  4. except Exception as e:
  5. print(e) # 错误信息比较的少
  6. 使用traceback模块,获取更详细的错误信息
  7. 2. 提升ssh类方案下采集效率
  8. 线程与进程的区别
  9. 线程池的使用
  10. from concurent.futures import TheadpollExecute
  11. p = TheadpollExecute(10)
  12. p.submit(task, i)
  13. 3. 数据表的设计
  14. 遵循的大原则,表中的字段的设计一定是和客户端的传来的字段要一致
  15. 表和表的关系(一对一,一对多,多对多)
  16. 面试的时候,主要的套路就是 : 项目 + 基础python技术点 + mysql + redis
  17. 注意,公司核心的业务,建议一台服务?上就跑这一个业务就好了。那此时,最好的做法就是,这
  18. </code>

agent方案: 适用于 机?多的情况下 (500台)

ssh方案: 适用于机?少的情况下

CMDB

数据入库

以磁盘数据为例,分析入库

核心目标:api从数据库中获取老的数据,然后客户端提交过来新的数据,此时,API分析的时候,需要新老数据进行对比

  1. <code class="language-python">from django.shortcuts import render, HttpResponse, redirect
  2. # Create your views here.
  3. import json
  4. from repository import models
  5. def asset(request):
  6. if request.method == ‘POST‘:
  7. new_server_info = json.loads(request.body)
  8. # 判断状态码是否为1000
  9. # 1.判断主机名知否合法
  10. hostname = new_server_info[‘basic‘][‘data‘][‘hostname‘]
  11. server_obj = models.Server.objects.filter(hostname = hostname).first()
  12. if not server_obj:
  13. return HttpResponse(‘主机名未被提前录入,非法数据‘)
  14. # 分析磁盘数据为例
  15. # disk采集出错,保存信息
  16. status = new_server_info[‘disk‘][‘status‘]
  17. if status != 10000:
  18. # title= 标题 content= 报错信息 asset_obj = 外键(出错的服务器)
  19. models.ErrorLog.objects.create(title=‘%s采集出错‘%hostname,content=new_server_info[‘disk‘][‘data‘],asset_obj=server_obj)
  20. return HttpResponse(‘采集出错‘)
  21. # 增加的磁盘slot
  22. new_disk_info = new_server_info[‘disk‘][‘data‘]
  23. new_slot = set(new_disk_info.keys()) # 获取所有的key [1,2,3,4,5 ]
  24. # 获取数据库中旧的数据
  25. old_slot = []
  26. # 查询数据库中的当前主机对象对应的disk数据
  27. old_disk_info = models.Disk.objects.filter(server_obj=server_obj)
  28. # 获取旧的obj
  29. for obj in old_disk_info:
  30. old_slot.append(obj.slot) # 旧的磁盘数据的值
  31. # 增加slot对应的磁盘数据
  32. # difference集合求差集 [0,1,2,3] - [2,3,5] = {0,1}
  33. add_slot = set(new_slot).difference(set(old_slot))
  34. if add_slot:
  35. for slot in add_slot:
  36. add_disk_info = new_disk_info[slot]
  37. # 添加外键字段,然后再使用**打散数据
  38. add_disk_info[‘server_obj‘] = server_obj
  39. models.Disk.objects.create(**add_disk_info)
  40. # 删除
  41. # 查看新获取的数据,和数据库中的数据. 将旧的数据库中多的删除,就同步了新获取数据
  42. del_slot = set(old_slot).difference(set(new_slot))
  43. if del_slot:
  44. models.Disk.objects.filter(server_obj=server_obj,slot__in =del_slot).delete()
  45. # 更新(求交集)
  46. updata_slot = set(old_slot).intersection(set(new_slot))
  47. if updata_slot:
  48. for slot in updata_slot:
  49. old_disk_row = models.Disk.objects.filter(server_obj=server_obj, slot=slot).first()
  50. new_disk_row = new_disk_info[slot]
  51. # 判断新老数据是否变化
  52. for k, new_v in new_disk_row.items():
  53. # 利用反射获取old_disk_row中的v值
  54. old_v = getattr(old_disk_row, k)
  55. # 判断旧的与新的v值的不同(不同就需要更新)
  56. if new_v != old_v:
  57. setattr(old_disk_row, k, new_v)
  58. old_disk_row.save()
  59. return HttpResponse(‘ok‘)
  60. else:
  61. # 需要连接数据库,获取主机列表
  62. return [‘c1.com‘,‘c2.com‘]
  63. </code>

展示

将数据从数据库中取出来,进行展示

  • 前后端分离
    • Vue + drf
  • 前后端不分离
    • Django中的模板
    • xadmin

xadmin

直接替换掉Django自带的admin系统,并提供了很多有用的东西;完全的可扩展的插件支持,基于Twitter Bootstrap的漂亮UI。

20200312 CMDB的磁盘数据查询

标签:import   效率   diff   aaa   目录   注意   print   else   可扩展   

人气教程排行