zoukankan      html  css  js  c++  java
  • 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,虚拟化,存储

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

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

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

  • 相关阅读:
    UVA
    UVA
    模板——扩展欧几里得算法(求ax+by=gcd的解)
    UVA
    模板——2.2 素数筛选和合数分解
    模板——素数筛选
    Educational Codeforces Round 46 (Rated for Div. 2)
    Educational Codeforces Round 46 (Rated for Div. 2) E. We Need More Bosses
    Educational Codeforces Round 46 (Rated for Div. 2) D. Yet Another Problem On a Subsequence
    Educational Codeforces Round 46 (Rated for Div. 2) C. Covered Points Count
  • 原文地址:https://www.cnblogs.com/zyxnhr/p/14500714.html
Copyright © 2011-2022 走看看