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

    已获得更改记录


    感谢老男孩教育

    作者:梦中泪
    关于作者:云计算,linux,虚拟化,存储

    ---------------------------------------------------------------------------

    个性签名:我以为我很颓废,今天我才知道,原来我早报废了。

    如果觉得本篇文章最您有帮助,欢迎转载,且在文章页面明显位置给出原文链接!记得在右下角点个“推荐”,博主在此感谢!

  • 相关阅读:
    Python入门 日志打印
    Python入门 面向对象
    Python入门 更换pip源的方法
    Python入门 模块
    Python入门 函数式编程
    四月份该做的事情
    Docker入门 配置篇
    Python入门 序列章
    Python入门 值内存管理与所有的关键字
    论操作系统的IO
  • 原文地址:https://www.cnblogs.com/zyxnhr/p/14500714.html
Copyright © 2020-2023  润新知