python-cmdb资产管理项目4-资产入库处理以及资产变更记录处理
一 资产入库处理
1.1 连接数据库
在192.168.100.101安装数据库,并给总控机授权可以操作,并创建一个autoserver的数据库,密码123456
settiing.py 配置数据库连接
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'autoserver', 'HOST': '192.168.100.101', 'PORT': 3306, 'USER': "root", 'PASSWORD': "123456", } }
1.2 创建数据库和表
创建数据库方法参考https://www.cnblogs.com/zyxnhr/p/12629172.html
/home/ningherui/PycharmProjects/cmdb_first_step/autoserver/api/models.py
from django.db import models # Create your models here. class Server(models.Model): # server_table,服务器表 hostname = models.CharField(verbose_name="主机名",max_length=32) class Disk(models.Model): # disk_table,硬盘信息表 slot = models.CharField(verbose_name="槽位",max_length=32) pd_type = models.CharField(verbose_name="类型",max_length=32) capacity = models.CharField(verbose_name="容量",max_length=32) model = models.CharField(verbose_name="型号",max_length=32) server = models.ForeignKey(verbose_name="服务器",to='Server',on_delete=models.CASCADE)
执行 python3 manage.py makemigrations
执行python3 manage.py migrate查看数据库
autoserver的view文件如下
/home/ningherui/PycharmProjects/cmdb_first_step/autoserver/api/views.py
import json from django.shortcuts import render,HttpResponse from django.http import JsonResponse from django.views.decorators.csrf import csrf_exempt # Create your views here. @csrf_exempt def get_data(request): #print(request.body) #序列化和反序列化 content = request.body.decode('utf-8') server_info_dict = json.loads(content) hostname = server_info_dict['host'] info_dict = server_info_dict['info'] print(info_dict['disk']) #获取数据之后,把他们放到数据库,然后使用web的APP展示数据 return HttpResponse('成功')
运行autoserver,执行autoclient的app.py,执行,获取disk信息如下
{'status': True, 'data': { '1': {'slot': '1', 'pd_type': 'SATA', 'capacity': '465.761', 'model': 'jinshidun'}, '2': {'slot': '2', 'pd_type': 'SATA', 'capacity': '465.761', 'model': 'Samsung'}, '3': {'slot': '3', 'pd_type': 'SATA', 'capacity': '900.12', 'model': 'huawei'}, }, 'error': None}
将上述信息,写入数据库中,这种方式也可以做成模块化的方式
1.3 采集资产的硬盘信息
建立一个server的目录,其中也包含disk.py处理硬盘信息
/home/ningherui/PycharmProjects/cmdb_first_step/autoserver/api/service/disk.py
from api import models def process_disk_info(host_object,disk_dict): ''' 处理汇报来的硬盘信息 :return: ''' if not disk_dict['status']: print('硬盘资产信息没有获取到') print('获取硬盘资产时报错:',disk_dict['error']) return print(disk_dict) new_disk_dict = disk_dict['data'] #数据库中的硬盘信息 db_disk_queryset = models.Disk.objects.filter(server=host_object).all() db_disk_dict = {row.slot:row for row in db_disk_queryset} print(new_disk_dict) print('===========================') print(db_disk_dict)
结果如下:
{ '0': {'slot': '0', 'pd_type': 'SATA', 'capacity': '465.761', 'model': 'jinshidun'}, '2': {'slot': '2', 'pd_type': 'SATA', 'capacity': '465.761', 'model': 'Samsung'}, '3': {'slot': '3', 'pd_type': 'SATA', 'model': 'huawei'
}} #new_disk_dict 新采集的数据 =========================== {' 1': <Disk: Disk object (1)> #db_disk_dict 从数据库中获取的数据 }
然后进行更新数据库信息
''' 更新数据库信息 models.User.objects.filter(id=3).update(age=18) obj = models.User.objects.filter(id=3).first() obj.age = 19 obj.save() '''
数据在插入一条数据,则数据库中有两条数据
insert into api_disk values("2","2","ssd","912","sanxing","1");
对数据库进行操作的逻辑:
from api import models def process_disk_info(host_object,disk_dict): ''' 处理汇报来的硬盘信息 :return: ''' if not disk_dict['status']: print('硬盘资产信息没有获取到') print('获取硬盘资产时报错:',disk_dict['error']) return # print(disk_dict) new_disk_dict = disk_dict['data'] #set 就可以取出key值变成集合 new_disk_slot_set = set(new_disk_dict) #数据库中的硬盘信息 db_disk_queryset = models.Disk.objects.filter(server=host_object).all() db_disk_dict = {row.slot:row for row in db_disk_queryset} db_disk_slot_set = set(db_disk_dict) # 如果数据库中没有,就创建数据,用new_disk_slot_set - db_disk_slot_set就是数据库中没有的,则创建 create_slot_set = new_disk_slot_set - db_disk_slot_set #如果数据库中有,而采集的数据没有,则删除 remove_slot_set = db_disk_slot_set - new_disk_slot_set #如果数据库和新增数据都有,但是数据有变化,则更新数据 update_slot_set = new_disk_slot_set & db_disk_slot_set print("增加",create_slot_set) print("删除",remove_slot_set) print("更新",update_slot_set)
结果如下
增加 {'0', '3'} 删除 {'1'} 更新 {'2'}
进行操作
更新数据时,需要提取数据
for slot in update_slot_set: # new_disk_dict[slot] #'0': {'slot': '0', 'pd_type': 'SATA', 'capacity': '465.761', 'model': 'jinshidun'} # db_disk_dict[slot] # 对象 #循环新数据的key和value for key,value in new_disk_dict[slot].items(): # 每一项数据库中的值,获取对象的某一个值,对象.x 等同于getatt("对象",'x') ---> getattr(db_disk_dict[slot],key) # 每一项新增的值 ---> value print(key,value,getattr(db_disk_dict[slot],key))
整个对数据库的操作代码如下:
from api import models def process_disk_info(host_object,disk_dict): ''' 处理汇报来的硬盘信息 :return: ''' if not disk_dict['status']: print('硬盘资产信息没有获取到') print('获取硬盘资产时报错:',disk_dict['error']) return # print(disk_dict) new_disk_dict = disk_dict['data'] #set 就可以取出key值变成集合 new_disk_slot_set = set(new_disk_dict) #数据库中的硬盘信息 db_disk_queryset = models.Disk.objects.filter(server=host_object).all() db_disk_dict = {row.slot:row for row in db_disk_queryset} db_disk_slot_set = set(db_disk_dict) # 如果数据库中没有,就创建数据,用new_disk_slot_set - db_disk_slot_set就是数据库中没有的,则创建 create_slot_set = new_disk_slot_set - db_disk_slot_set print("增加",create_slot_set) for slot in create_slot_set: #**表示对字典操作 models.Disk.objects.create(**new_disk_dict[slot],server=host_object) #如果数据库中有,而采集的数据没有,则删除 remove_slot_set = db_disk_slot_set - new_disk_slot_set print("删除", remove_slot_set) models.Disk.objects.filter(server=host_object,slot__in=remove_slot_set).delete() #如果数据库和新增数据都有,但是数据有变化,则更新数据 update_slot_set = new_disk_slot_set & db_disk_slot_set print("更新",update_slot_set) for slot in update_slot_set: # new_disk_dict[slot] #'0': {'slot': '0', 'pd_type': 'SATA', 'capacity': '465.761', 'model': 'jinshidun'} # db_disk_dict[slot] # 对象 #循环新数据的key和value for key,value in new_disk_dict[slot].items(): # 每一项数据库中的值,获取对象的某一个值,对象.x 等同于getatt("对象",'x') ---> getattr(db_disk_dict[slot],key) # 每一项新增的值 ---> value #print(key,value,getattr(db_disk_dict[slot],key)) #进行赋值更新操作 setattr(db_disk_dict[slot],key,value) #写入数据库 db_disk_dict[slot].save()
操作后,查看数据库已经更新:
二 资产变更记录
2.1 建表
创建一个新的表,存放变更记录
/home/ningherui/PycharmProjects/cmdb_first_step/autoserver/api/models.py
from django.db import models # Create your models here. class Server(models.Model): # server_table 服务器表 hostname = models.CharField(verbose_name="主机名",max_length=32) class Disk(models.Model): # disk_table,硬盘信息表 slot = models.CharField(verbose_name="槽位",max_length=32) pd_type = models.CharField(verbose_name="类型",max_length=32) capacity = models.CharField(verbose_name="容量",max_length=32) model = models.CharField(verbose_name="型号",max_length=32) server = models.ForeignKey(verbose_name="服务器",to='Server',on_delete=models.CASCADE) class AssetsRecord(models.Model): ''' 资产变更记录 ''' content = models.TextField(verbose_name="内容") server = models.ForeignKey(verbose_name="服务器",to='Server',on_delete=models.DO_NOTHING) create_data = models.DateTimeField(verbose_name="时间",auto_now=True)
2.2 更新disk数据处理
from api import models def process_disk_info(host_object,disk_dict): ''' 处理汇报来的硬盘信息 :return: ''' if not disk_dict['status']: print('硬盘资产信息没有获取到') print('获取硬盘资产时报错:',disk_dict['error']) return # print(disk_dict) new_disk_dict = disk_dict['data'] #set 就可以取出key值变成集合 new_disk_slot_set = set(new_disk_dict) #数据库中的硬盘信息 db_disk_queryset = models.Disk.objects.filter(server=host_object).all() db_disk_dict = {row.slot:row for row in db_disk_queryset} db_disk_slot_set = set(db_disk_dict) # 如果数据库中没有,就创建数据,用new_disk_slot_set - db_disk_slot_set就是数据库中没有的,则创建 create_slot_set = new_disk_slot_set - db_disk_slot_set record_str_list = [] print("增加",create_slot_set) for slot in create_slot_set: #**表示对字典操作 models.Disk.objects.create(**new_disk_dict[slot],server=host_object) msg = "[新增硬盘]槽位:{slot},类型{pd_type},容量{capacity}".format(**new_disk_dict[slot]) record_str_list.append(msg) #如果数据库中有,而采集的数据没有,则删除 remove_slot_set = db_disk_slot_set - new_disk_slot_set print("删除", remove_slot_set) models.Disk.objects.filter(server=host_object,slot__in=remove_slot_set).delete() if remove_slot_set: msg = "[删除硬盘]槽位:{}".format(','.join(remove_slot_set)) record_str_list.append(msg) #如果数据库和新增数据都有,但是数据有变化,则更新数据 update_slot_set = new_disk_slot_set & db_disk_slot_set print("更新",update_slot_set) for slot in update_slot_set: # new_disk_dict[slot] #'0': {'slot': '0', 'pd_type': 'SATA', 'capacity': '465.761', 'model': 'jinshidun'} # db_disk_dict[slot] # 对象 temp = [] #循环新数据的key和value for key,value in new_disk_dict[slot].items(): # 每一项数据库中的值,获取对象的某一个值,对象.x 等同于getatt("对象",'x') ---> getattr(db_disk_dict[slot],key) # 每一项新增的值 ---> value #print(key,value,getattr(db_disk_dict[slot],key)) old_vaule = getattr(db_disk_dict[slot],key) if value == old_vaule: continue msg = "硬盘的{},由{}变成了{}".format(key,old_vaule,value) temp.append(msg) #进行赋值更新操作 setattr(db_disk_dict[slot],key,value) #写入数据库 if temp: db_disk_dict[slot].save() row = "[更新硬盘]槽位:{},更新的内容:{}".format(slot,':'.join(temp)) record_str_list.append(row) print(record_str_list) if record_str_list: models.AssetsRecord.objects.create(content="\n".join(record_str_list),server=host_object)
格式化字符串
"(a1)s-asdfccdas %(a2)s" %{'a1':1,'a2':123456} "{a1}-asedf{a2}".format(**{'a1':1,'a2':'alex'})
2.3 结果信息
更改数据库或者disk.out的内容,执行效果如下:
已获得更改记录
感谢老男孩教育
---------------------------------------------------------------------------
个性签名:我以为我很颓废,今天我才知道,原来我早报废了。
如果觉得本篇文章最您有帮助,欢迎转载,且在文章页面明显位置给出原文链接!记得在右下角点个“推荐”,博主在此感谢!