一 资产入库处理

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的内容,执行效果如下:

已获得更改记录


感谢老男孩教育

python-cmdb资产管理项目4-资产入库处理以及资产变更记录处理的更多相关文章

  1. CMDB服务器管理系统【s5day89】:部分数据表结构-资产入库思路

    1.用django的app作为统一调用库的好处 1.创建repository app截图如下: 2.好处如下: 1.app的本质就是一个文件夹 2.以后所有的app调用数据就只去repository调 ...

  2. CMDB03 /今日未采集的资产、资产入库、资产变更记录、资产采集

    CMDB03 /今日未采集的资产.资产入库.资产变更记录.资产采集 目录 CMDB03 /今日未采集的资产.资产入库.资产变更记录.资产采集 1. 获取今日未采集的服务器 2. server资产入库以 ...

  3. 2016年GitHub排名前20的Python机器学习开源项目(转)

    当今时代,开源是创新和技术快速发展的核心.本文来自 KDnuggets 的年度盘点,介绍了 2016 年排名前 20 的 Python 机器学习开源项目,在介绍的同时也会做一些有趣的分析以及谈一谈它们 ...

  4. cocos2d-x使用python脚本创建项目的简单方法

    本文有CC原创,转载请注明地址:http://blog.csdn.net/oktears/article/details/13297003 在cocos2d-x2.1.4以上的版本中,取消了使用vs模 ...

  5. Python CMDB开发

    Python CMDB开发   运维自动化路线: cmdb的开发需要包含三部分功能: 采集硬件数据 API 页面管理 执行流程:服务器的客户端采集硬件数据,然后将硬件信息发送到API,API负责将获取 ...

  6. 10个Python基础练习项目,你可能不会想到练手教程还这么有趣

    美国20世纪最重要的实用主义哲学家约翰·杜威提出一个学习方法,叫做:Learning By Doing,在实践中精进.胡适.陶行知.张伯苓.蒋梦麟等都曾是他的学生,杜威的哲学也影响了蔡元培.晏阳初等人 ...

  7. python爬虫scrapy项目详解(关注、持续更新)

    python爬虫scrapy项目(一) 爬取目标:腾讯招聘网站(起始url:https://hr.tencent.com/position.php?keywords=&tid=0&st ...

  8. Python NLP完整项目实战教程(1)

    一.前言 打算写一个系列的关于自然语言处理技术的文章<Python NLP完整项目实战>,本文算是系列文章的起始篇,为了能够有效集合实际应用场景,避免为了学习而学习,考虑结合一个具体的项目 ...

  9. Python+Flask+Gunicorn 项目实战(一) 从零开始,写一个Markdown解析器 —— 初体验

    (一)前言 在开始学习之前,你需要确保你对Python, JavaScript, HTML, Markdown语法有非常基础的了解.项目的源码你可以在 https://github.com/zhu-y ...

随机推荐

  1. MySQL常用配置参数说明

    1.sync_binlog sync_binlog=0,当事务提交之后,MySQL不做fsync之类的磁盘同步指令刷新binlog_cache中的信息到磁盘,而让Filesystem自行决定什么时候来 ...

  2. Python基础(九):字典的使用

    创建字典的5种方式 用{}创建字典 >>> a = {'name':'韩梅梅','age':18,'job':'teacher'} >>> print(a) {'n ...

  3. OO_Unit2_Summary

    经过三周的自己电梯瞎设计,下次坐电梯想我想的可能就不是如何优化调度算法,而是千万别把自己死锁在电梯里了(手动狗头) 一.设计策略 1. 需求分析: 作业一:单部多线程可稍带电梯,一部电梯,固定楼层,不 ...

  4. position:sticky 粘性定位的几种巧妙应用

    背景:position: sticky 又称为粘性定位,粘性定位的元素是依赖于用户的滚动,在 position:relative 与 position:fixed 定位之间切换.元素根据正常文档流进行 ...

  5. Github Pages+Gridea设置DisqusJS评论

    1 前言 相信很多人都对Github Pages不默认,笔者之前写过了一篇文章,使用Github Pages去搭建博客的,链接可以戳这里. 但是唯一的不足是没有提到评论,因为当时笔者测试了一下,评论设 ...

  6. MVVM框架理解

    MVC框架 将整个前端页面分成View,Controller,Modal,视图上发生变化,通过Controller(控件)将响应传入到Model(数据源),由数据源改变View上面的数据. 整个过程看 ...

  7. 这个世界上只有一个你之Java设计模式:单例模式

    目录 单例模式的要点 单例模式的特点 饿汉式单例类 懒汉式单例类 一:懒汉式,线程不安全 二:懒汉式,线程安全 三:懒汉式,线程不安全 四:懒汉式,双检锁/双重校验锁 五:懒汉式,静态内部类 六:懒汉 ...

  8. BLUENRG-LP 学习笔记

    在学习 BLUENRG-LP 的过程中,及时地把碰到的问题记录下来,并作解答,形成本文档. 该文档会时时更新,并且当某些章节内容过多时,会独立出来,形成新的文章. BLUENRG-LP 的特性 芯片内 ...

  9. CentOS7 常用基础操作

    系统目录结构了解 CentOS系统中没有磁盘的概念,一切皆文件,/目录下的的一个个文件夹目录就相当于磁盘了,这里简单记录几个常用的目录以及对应的作用: dev:Linux一切皆文件,包括硬件也进行了文 ...

  10. Windows中动态磁盘管理

    目录 动态磁盘 基本磁盘和动态磁盘的转换 简单卷 跨区卷 带区卷 镜像卷 RAID-5卷 相关文章:硬盘分区形式(MBR.GPT).系统引导.文件系统.Inode和Block 动态磁盘 Windows ...