现在api服务器就可以得到我们想要做的操作了。接下来应该是采集操作完成后补充相应的编程了
我们要做的就是将post请求发送的数据保存到数据库中。我们使用存储库名称和设计模型创建一个应用程序来创建表来存储数据。稍后可以从数据库中获取信息并显示
从 django.db 导入模型 类业务单元(模型.模型): """ 业务线 """ ? 类元: verbose_name_plural = "业务线表" def __str__(自身): 返回 www.sychzs.cn 类IDC(模型.模型): """ 机房信息 """ name = models.CharField('机房', max_length=32) 楼层 = models.IntegerField(' 楼层 ', 默认=1)类元: verbose_name_plural = "机房桌" def __str__(自身): 返回 www.sychzs.cn 类服务器(模型.模型): """ 服务器信息主机 """ device_status_choices = ( (1, '可用'), (2,'在线'), (3,'离线'), (4、'已删除'), ) device_status_id = models.IntegerField('设备状态 ', Choices=device_status_choices, 默认 =1) idc = models.ForeignKey('IDC', verbose_name='IDC机房',null=True,空白=True,on_delete=models.CASCADE) Cabinet_num = models.CharField('柜号 ', max_length=30, null =正确,空白=正确) Cabinet_order = models.CharField('机柜中的序列号 ', max_length=30, nu ll=真,空白=正确)Business_unit = models.ForeignKey('BusinessUnit', verbose_name='业务属于 ', 的线路null =True, 空白=True, on_delete=models.CASCADE) # 基本信息+主板信息+CPU信息 主机名= models.CharField('主机名', max_length=128, unique=True) os_platform = models.CharField(' 系统 ', max_length=16, null =正确,空白=正确) os_version = models.CharField('系统版本 ', max_length=16, null =正确,空白=正确) sn = models.CharField('SN 编号 ', max_length=64, db_index=Tru e) 制造商 = models.CharField(verbose_name=' 制造商 ', max_length=64, nu ll=正确,空白=正确) 模型 = models.CharField('模型 ', max_length=64, null=正确,空白=正确)cpu_count = models.IntegerField('CPU 数量 ', null=正确,空白=正确) cpu_physical_count = models.IntegerField('CPU 物理编号 ', null =正确,空白=正确) cpu_model = models.CharField('CPU 型号 ', max_length=128, null =正确,空白=正确) latest_date = models.DateField('最后更新时间', null= 正确) create_at = models.DateTimeField(auto_now_add=True, 空白=True) 类元: verbose_name_plural = "服务器表" def __str__(自身): 返回 self.hostname 类磁盘(型号.型号): """ 硬盘信息 """ 插槽 = models.CharField(' 插槽位置 ', max_length=8) model = models.CharField('磁盘型号', max_length=108) 容量 = models.FloatField('磁盘容量 GB') pd_type = models.CharField('磁盘类型', max_length=32)服务器= models.ForeignKey(verbose_name='服务器', to='服务器', related_name= 'disk_list', on_delete=models.CASCADE) 类元: verbose_name_plural = "硬盘表" def __str__(自身): 返回 self.slot 类 NIC(型号.型号): """ 网卡信息 """ name = models.CharField('网卡名称', max_length=128) hwaddr = models.CharField('网卡mac地址', max_length=64) 网络掩码 = models.CharField(max_length=64) ipaddrs = models.CharField('ip 地址', max_length=256) 向上 = models.BooleanField(default=False) 服务器= models.ForeignKey('服务器', related_name='nic_list',on_delete=模型。级联) 类元: verbose_name_plural = "网卡表" def __str__(自身): 返回 www.sychzs.cn类内存(模型.模型): """ 内存信息 """ 插槽 = models.CharField(' 插槽位置 ', max_length=32) 制造商= models.CharField('制造商', max_length=32, null =正确,空白=正确) 模型 = models.CharField(' 模型 ', max_length=64) 容量 = models.FloatField('容量', null=True, 空白 = 正确) sn = models.CharField('内存SN号', max_length=64, null =正确,空白=正确) = models.CharField('速度', max_length=16, 空速度 =正确,空白=正确) 服务器 = models.ForeignKey('服务器', related_name='内存列表 ',on_delete=模型。级联) 类元: verbose_name_plural = "内存表" def __str__(自身): 返回 self.slot 类AssetRecord(models.Model): """ 资产变动记录""" 服务器 = models.ForeignKey('服务器', related_name='服务器',on_delete=模型。级联) 内容= models.TextField(null=True) create_at = models.DateTimeField(auto_now_add=True) 类元: verbose_name_plural = "资产记录表" 类错误日志(模型.模型): """ 错误日志,如:座席数据采集错误或运行错误 """ 服务器 = models.ForeignKey('Server', null=True, 空白 =True, on_delete=models.CASCADE) 标题= models.CharField(max_length=16) 内容= models.TextField() create_at = models.DateTimeField(auto_now_add=True) 类元: verbose_name_plural = "错误日志表" def __str__(自身): 返回自我标题
我们可以先把业务线设置到这个。然后执行命令生成表
我们先删除cert,把这里写的文件注释掉,这样每次判断的时候都会添加一个新的host
服务器接收到的数据如下图,并存储在数据库中
我们要将新添加的资产信息存入数据库
我们先来看看新服务器。 1 和 2 有默认值可以为空。我们暂时忽略它吧
我们先看看这三类硬件信息
这三类硬件信息和我们传过来的数据一致,字段名称也一样
我们把数据字典拿出来,然后更新到同一个字典中,合成为一个。
9 {IMG_9:Ahr0Chm6ly9pbwcymDe4LMNUYMXVZ3MUY2JSB2CVMTI4NJUXMI8ymde5mdgvmti4njuxmDe5mdgxmdkyni02nju1MZQ5NJEUC G5n/}获取以下词典
{ 'os_platform':'linux', 'os_version':'6.5', '主机名':'www.sychzs.cn', A'制造商':Parallels Software International Inc.', '型号':'Parallels 虚拟平台', 'sn':'Parallels-1A 1B CB 3B 64 66 4B 13 86 B0 86 FF 7E 2B 20 30','cpu_count':24, 'cpu_physical_count':2, 'cpu_model':' Intel(R) Xeon(R) CPU E5-2620 v2 @ 2.10GHz ' }
然后执行命令创建ORM对象,将字典打散存入数据库
查看新添加的硬盘。硬盘是一个插槽,也是一个硬盘。之前添加了一个新服务器。这个服务器对象已经存在,所以硬盘属于外键server=server。 for循环对外部字典进行赋值,然后将每个内部字典插入到Disk数据表中。
这样可以节省6槽硬盘
这里for循环插入数据并连接数据库一次。我们可以优化它
for 循环创建 Disk 对象并将它们附加到列表中。 bulk_create方法根据对象列表一次性批量创建数据表记录
1 {IMG_14:Ahr0Chm6ly9pbwcymDe4LMNUYMXVZ3MUY2JSB2CVMTI4NJUXMI8ymde5mdgvmti4njuxmDe5MDGXNDUYODYODYODY3NJM1MJMU CG5N/}添加内存与添加硬盘相同
有问题,因为数据结构内存和网卡没有修改,没有保存
修改后,点击执行客户端。客户端收集信息并发送给api然后保存到数据库
新网卡有点不同,它使用name作为key,但数据中没有name,
所以创建的时候需要添加名字,循环取出它的key添加到数据库中
我们创建一个证书,并使主机名与我们定期收集的主机名一致。这样我们就可以更新资产信息了
api服务器更新资产信息。服务器上要写的更新程序如下
我们来看看更新主机表的流程
接下来我会修改host表,执行客户端程序后更新
2 {IMG_23: Ahr0Chm6ly9pbwcymDe4LMNUYMXVZ3MUY2JSB2CVMTI4NJUXMI8ymde5mdgvmti4njuxmDe5mDGXTGWOTCZMZIZIZIZIZIZIZIZIZIZIZIZIZIMY5WBBBBBBB mc =/}
现在我们修改数据库如下:
2 {IMG_25:Ahr0Chm6ly9pbwcymDe4LMNUYMXVZ3MUY2JSB2CVMTI4NJUXMI8ymde5mdgvmti4njuxmDe5MDGXTE3MTATQZNTQZNTK2MJKU CG5N/}因为这里每次提交都是0-5,所以添加、更新、删除就如上
添加、删除和更新如下。添加是集合减去数据库(多出来的都是集合),删除是数据库减去集合(数据库多出来的),更新既是集合又是数据库(使用&set操作)。这样就得到了槽位信息,并根据槽位信息对该记录进行相应的操作。
2 {IMG_27:Ahr0Chm6ly9pbwcymDe4LMNUYMXVZ3MUY2JSB2CVMTI4NJUXMI8ymde5mdgvmti4njuxMi0ymde5MDGXNTE3MY0XMZQ4MZIYNTMU CG5N/}根据这三个操作获取到的硬盘槽位,进行相应的操作
当客户端执行采集上报时,服务器显然会进行相应的硬盘更新
观察内存和网卡的程序类似,只是名称有点不同。可以用notepad++替换,然后正确更改差异,从而完成内存和网卡的更新操作
#更新内存 内存信息=信息['内存']['数据'] # 新提交的数据 内存槽集= 集(内存信息) memory_slot__db_set = {i.slot for i in models.Memory.objects.filter(server=服务器)} # 添加删除更新 add_slot_set = memory_slot_set - memory_slot__db_set # 新插槽 del_slot_set = memory_slot__db_set - memory_slot_set # 删除的槽 update_slot_set = memory_slot__db_set & memory_slot_set # 更新插槽 #添加内存 add_memory_lit = [] 用于插槽在add_slot_set: 内存=内存_info。获取(插槽) add_memory_lit.append(models.Memory(**内存,服务器=服务器)) ifadd_memory_lit:models.Memory.objects.bulk_create(add_memory_lit) # 删除内存 ifdel_slot_set: models.Memory.objects.filter(server=server, slot__in=del_slot_set).delete() # 更新内存 用于插槽在 update_slot_set: 内存=内存_info。获取(插槽) models.Memory.objects.filter(服务器=服务器,插槽=插槽).update(**内存)
nic_info = 信息['nic']['数据'] # 新提交的数据 nic_name_set = 集(nic_info) nic_name__db_set = {www.sychzs.cn for i in models.NIC.objects.filter(server=server) } #新增删除更新 add_name_set = nic_name_set - nic_name__db_set # 新增的槽位 del_name_set = nic_name__db_set - nic_name_set # 删除的槽位 update_name_set = nic_name__db_set & nic_name_set # 更新的槽位 # 新增带宽 add_nic_lit = [] 对于名称在add_name_set: nic = nic_info.get(名称)nic['名称'] =名称 add_nic_lit.append(models.NIC(**nic, 服务器=服务器)) ifadd_nic_lit: models.NIC.objects.bulk_create(add_nic_lit) # 删除网卡 ifdel_name_set: models.NIC.objects.filter(server=服务器, name__in=del_name_set).delete() # 更新网卡 对于名称在update_name_set: nic = nic_info.get(名称) nic['名称'] =名称 models.NIC.objects.filter(服务器=服务器, name=名称).update(**nic)
我们更改客户端上的cert文件内容,使其与将要收集的信息不一致,这样程序就会更新主机名和资产信息
{ '磁盘':{ '状态':正确, '错误':'', '数据':{ '0':{ '插槽':'0', 'pd_type':'SAS', '容量':'279.396', '型号':'SEAGATE ST300MM0006 LS08S0K2B5NV' }, '1':{ '插槽':'1', 'pd_type':'SAS', '容量':'279.396', '型号':'SEAGATE ST300MM0006 LS08S0K2B5AH' }, '2':{ '插槽':'2', 'pd_type':'SATA', '容量':'476.939','型号':'S1SZNSAFA01085L 三星 SSD 850 PRO 512GB EXM01B6Q' }, '3':{ '插槽':'3', 'pd_type':'SATA', '容量':'476.939', '型号':'S1AXNSAF912433K 三星 SSD 840 PRO 系列 DXM06B0Q' }, '4':{ '插槽':'4', 'pd_type':'SATA', '容量':'476.939', '型号':'S1AXNSAF303909M三星SSD 840 PRO系列DXM05B0Q' }, '5':{ '插槽':'5', 'pd_type':'SATA', '容量':'476.939','型号':'S1AXNSAFB00549A三星SSD 840 PRO系列DXM06B0Q' } } }, '记忆':{ '状态':正确, '错误':'', 'data': { 'DIMM #0': { 'capacity': 1024, 'slot': 'DIMM #0', 'model': 'DRAM', 'speed': '667 MHz', 'manufacturer': 'Not Specified', 'sn': 'Not Specified' }, 'DIMM #1': { 'capacity': 0, 'slot': 'DIMM #1', 'model': 'DRAM', 'speed': '667 MHz', 'manufacturer': 'Not Specified', 'sn': 'Not Specified' }, 'DIMM #2': { 'capacity': 0, 'slot': 'DIMM #2', 'model': 'DRAM', 'speed': '667 MHz', 'manufacturer': 'Not Specified', 'sn': 'Not Specified' }, 'DIMM #3': { 'capacity': 0, 'slot': 'DIMM #3', 'model': 'DRAM', 'speed': '667 MHz', 'manufacturer': 'Not Specified', 'sn': 'Not Specified' }, 'DIMM #4': { 'capacity': 0, 'slot': 'DIMM #4', 'model': 'DRAM', 'speed': '667 MHz', 'manufacturer': 'Not Specified', 'sn': 'Not Specified' }, 'DIMM #5': { 'capacity': 0, 'slot': 'DIMM #5', 'model': 'DRAM', 'speed': '667 MHz', 'manufacturer': 'Not Specified', 'sn': 'Not Specified' }, 'DIMM #6': { 'capacity': 0, 'slot': 'DIMM #6', 'model': 'DRAM', 'speed': '667 MHz', 'manufacturer': 'Not Specified', 'sn': 'Not Specified' }, 'DIMM #7': { 'capacity': 0, 'slot': 'DIMM #7', 'model': 'DRAM', 'speed': '667 MHz', 'manufacturer': 'Not Specified', 'sn': 'Not Specified' } } }, 'nic': { 'status': True, 'error': '', 'data': { 'eth0': { 'up': True, 'hwaddr': '00:1c:42:a5:57:7a', 'ipaddrs': '10.211.55.4', 'netmask': '255.255.255.0' } } }, 'basic': { 'status': True, 'error': '', 'data': { 'os_platform': 'linux', 'os_version': '6.5', 'hostname': 'www.sychzs.cn' } }, 'cpu': { 'status': True, 'error': '', 'data': { 'cpu_count': 24, 'cpu_physical_count': 2, 'cpu_model': ' Intel(R) Xeon(R) CPU E5-2620 v2 @ 2.10GHz' } }, 'main_board': { 'status': True, 'error': '', 'data': { 'manufacturer': 'Parallels Software International Inc.', 'model': 'Parallels Virtual Platform', 'sn': 'Parallels-1A 1B CB 3B 64 66 4B 13 86 B0 86 FF 7E 2B 20 30' } }, 'action': 'update_host', 'old_hostname': 'www.sychzs.cn' }
而提交过来的数据里面,还有老主机名,也就是文件里保存的主机名
因此服务端能从发送过来的info数据获取到主机名,从而从数据库查到这台服务器的信息,因为更新资产信息部分和之前写的单纯地更新资产信息部分是一样的。
这部分我们不用重复写了,所以直接在app里创建service模块写成函数进行调用。
from repository import models def process_basic(info): server_info = {} basic = info['basic']['data'] main_board = info['main_board']['data'] cpu = info['cpu']['data'] server_info.update(basic) server_info.update(main_board) server_info.update(cpu) hostname = info['basic']['data']['hostname'] # 新的hostname old_hostname = info.get('old_hostname') # 老的hostname server_list = models.Server.objects.filter(hostname=old_hostname if old_hostname else hostname) server_list.update(**server_info) server = models.Server.objects.filter(hostname=hostname).first() return server def process_disk(info, server): disk_info = info['disk']['data'] # 新提交的数据 disk_slot_set = set(disk_info) disk_slot__db_set = {i.slot for i in models.Disk.objects.filter(server=server)} # 新增 删除 更新 add_slot_set = disk_slot_set - disk_slot__db_set # 新增的槽位 添加硬盘 del_slot_set = disk_slot__db_set - disk_slot_set # 删除的槽位 减少硬盘 update_slot_set = disk_slot__db_set & disk_slot_set # 更新的槽位 更换硬盘 # 新增硬盘 add_disk_lit = [] for slot in add_slot_set: disk = disk_info.get(slot) add_disk_lit.append(models.Disk(**disk, server=server)) if add_disk_lit: models.Disk.objects.bulk_create(add_disk_lit) # 删除硬盘 if del_slot_set: models.Disk.objects.filter(server=server, slot__in=del_slot_set).delete() # 更新硬盘 for slot in update_slot_set: disk = disk_info.get(slot) models.Disk.objects.filter(server=server, slot=slot).update(**disk) def process_memory(info, server): # 更新内存 memory_info = info['memory']['data'] # 新提交的数据 memory_slot_set = set(memory_info) memory_slot__db_set = {i.slot for i in models.Memory.objects.filter(server=server)} # 新增 删除 更新 add_slot_set = memory_slot_set - memory_slot__db_set # 新增的槽位 del_slot_set = memory_slot__db_set - memory_slot_set # 删除的槽位 update_slot_set = memory_slot__db_set & memory_slot_set # 更新的槽位 # 新增内存 add_memory_lit = [] for slot in add_slot_set: memory = memory_info.get(slot) add_memory_lit.append(models.Memory(**memory, server=server)) if add_memory_lit: models.Memory.objects.bulk_create(add_memory_lit) # 删除内存 if del_slot_set: models.Memory.objects.filter(server=server, slot__in=del_slot_set).delete() # 更新内存 for slot in update_slot_set: memory = memory_info.get(slot) models.Memory.objects.filter(server=server, slot=slot).update(**memory) def process_nic(info, server): nic_info = info['nic']['data'] # 新提交的数据 nic_name_set = set(nic_info) nic_name__db_set = {www.sychzs.cn for i in models.NIC.objects.filter(server=server)} # 新增 删除 更新 add_name_set = nic_name_set - nic_name__db_set # 新增的槽位 del_name_set = nic_name__db_set - nic_name_set # 删除的槽位 update_name_set = nic_name__db_set & nic_name_set # 更新的槽位 # 新增网卡 add_nic_lit = [] for name in add_name_set: nic = nic_info.get(name) nic['name'] = name add_nic_lit.append(models.NIC(**nic, server=server)) if add_nic_lit: models.NIC.objects.bulk_create(add_nic_lit) # 删除网卡 if del_name_set: models.NIC.objects.filter(server=server, name__in=del_name_set).delete() # 更新网卡 for name in update_name_set: nic = nic_info.get(name) nic['name'] = name models.NIC.objects.filter(server=server, name=name).update(**nic)
然后我们导入这四个类并调用。这样就实现了更新资产信息了。
至于客户端主机名的修改,只需要将客户端这里的注释去掉就可以了