zoukankan      html  css  js  c++  java
  • cmdb autoserver端表数据分析

    目录:

    1.后台目录规划

    autoserver:
    api: 接收数据并进行二次分析入库 API验证

    backend : 负责后台管理

    repository:负责管理模型类 (数据表)

    autoserver服务端创建api.backend,repository应用

    执行以下命令

    startapp api

    startspp backend

    startspp repository

    并且一定要记得在settings注册应用名称

    INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'api.apps.ApiConfig',
    'backend',
    'repository'
    ]

    采集端采集的数据

    basic {'status': 10000, 'data': {'os_platform': 'linux', 'os_version': 'CentOS release 6.6 (Final) Kernel on an \m', 'hostname': 'c2.com'}}


    board {'status': 10000, 'data': {'manufacturer': 'Parallels Software International Inc.', 'product_name': 'Parallels Virtual Platform', 'sn': 'Parallels-1A 1B CB 3B 64 66 4B 13 86 B0 86 FF 7E 2B 20 30'}}

    硬盘
    disk {'status': 10000, 'data': {'0': {'slot': '0', 'pd_type': 'SAS', 'capacity': '279.396', 'model': 'SEAGATE ST300MM0006 LS08S0K2B5NV'}, '1': {'slot': '1', 'pd_type': 'SAS', 'capacity': '279.396', 'model': 'SEAGATE ST300MM0006 LS08S0K2B5AH'}, '2': {'slot': '2', 'pd_type': 'SATA', 'capacity': '476.939', 'model': 'S1SZNSAFA01085L Samsung SSD 850 PRO 512GB EXM01B6Q'}, '3': {'slot': '3', 'pd_type': 'SATA', 'capacity': '476.939', 'model': 'S1AXNSAF912433K Samsung SSD 840 PRO Series DXM06B0Q'}, '4': {'slot': '4', 'pd_type': 'SATA', 'capacity': '476.939', 'model': 'S1AXNSAF303909M Samsung SSD 840 PRO Series DXM05B0Q'}, '5': {'slot': '5', 'pd_type': 'SATA', 'capacity': '476.939', 'model': 'S1AXNSAFB00549A Samsung SSD 840 PRO Series DXM06B0Q'}}}


    memory {'status': 10000, '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'}}}


    cpu {'status': 10000, 'data': {'cpu_count': 24, 'cpu_physical_count': 2, 'cpu_model': ' Intel(R) Xeon(R) CPU E5-2620 v2 @ 2.10GHz'}}

    网卡
    nic {'status': 10000, 'data': {'eth0': {'up': True, 'hwaddr': '00:1c:42:a5:57:7a', 'ipaddrs': '10.211.55.4', 'netmask': '255.255.255.0'}}}

    根据以上的数据:设计出表

    server表写入的basic和board中的key作为字段,其他表根据自己的key作为字段

                                     

    repository

    models.py

    from django.db import models
    
    # Create your models here.
    class Server(models.Model):
        os_platform = models.CharField("操作系统平台", max_length=32,null=True)    #在django_admin中才会生效"操作系统平台"
        os_version = models.CharField(max_length=32, null=True)
        hostname = models.CharField(max_length=32, null=True)
        manufacture = models.CharField(max_length=32, null=True)
        model = models.CharField(max_length=32,null=True)
    
    
    class Cpu(models.Model):
        cpu_model = models.CharField(max_length=32,null =True)
        server_obj = models.ForeignKey('Server', related_name='cpu',null=True,on_delete=models.CASCADE)
    
    
    class Disk(models.Model):
        slot = models.IntegerField()
        server_obj = models.ForeignKey('Server', related_name='disk', null=True,on_delete=models.CASCADE)
    
    
    class Memory(models.Model):
        capacity = models.CharField(max_length=32, null=True)
        server_obj = models.ForeignKey('Server',on_delete=models.CASCADE)
    
    
    class Nic(models.Model):
        hwaddr = models.CharField(max_length=32)
        server_obj = models.ForeignKey('Server',on_delete=models.CASCADE)
    View Code

    Server表还有其他的字段,机房的各个信息

    repository

    models.py

    from django.db import models
    
    # Create your models here.
    
    class Idc(models.Model):
        idc_name = models.CharField(max_length=32)   #机房名
        idc_floor = models.CharField(max_length=32)   #机房层
    
    
    class Server(models.Model):
        os_platform = models.CharField("操作系统平台", max_length=32,null=True)    #在django_admin中才会生效"操作系统平台"
        os_version = models.CharField(max_length=32, null=True)
        hostname = models.CharField(max_length=32, null=True)
        manufacture = models.CharField(max_length=32, null=True)
        model = models.CharField(max_length=32,null=True)
        cabint_num = models.CharField(max_length=32)   #机器所在的机柜位置
        idc = models.ForeignKey('Idc',on_delete=models.CASCADE)   #机房
    
    
    class Cpu(models.Model):
        cpu_model = models.CharField(max_length=32,null =True)
        server_obj = models.ForeignKey('Server', related_name='cpu',null=True,on_delete=models.CASCADE)
    
    
    class Disk(models.Model):
        slot = models.IntegerField()
        server_obj = models.ForeignKey('Server', related_name='disk', null=True,on_delete=models.CASCADE)
    
    
    class Memory(models.Model):
        capacity = models.CharField(max_length=32, null=True)
        server_obj = models.ForeignKey('Server',on_delete=models.CASCADE)
    
    
    class Nic(models.Model):
        hwaddr = models.CharField(max_length=32)
        server_obj = models.ForeignKey('Server',on_delete=models.CASCADE)
    View Code

    因为公司里服务器是要提供给业务去使用的,创建一张产品线表跟server表就是一多的关系,一条产品线可以跑在多台服务器上,而一台服务器是否可以跑多个业务或一个业务都是由公司来决定的

    最终的表设计:repository
    from django.db import models
    
    class UserProfile(models.Model):
        """
        用户信息
        """
        name = models.CharField(u'姓名', max_length=32)
        email = models.EmailField(u'邮箱')
        phone = models.CharField(u'座机', max_length=32)
        mobile = models.CharField(u'手机', max_length=32)
        password = models.CharField(u'密码', max_length=64)
    
        class Meta:
            verbose_name_plural = "用户表"
    
        def __str__(self):
            return self.name
    
    class UserGroup(models.Model):
        """
        用户组
        """
        name = models.CharField(max_length=32, unique=True)
        users = models.ManyToManyField('UserProfile')
    
        class Meta:
            verbose_name_plural = "用户组表"
    
        def __str__(self):
            return self.name
    
    
    class BusinessUnit(models.Model):
        """
        业务线
        """
        name = models.CharField('业务线', max_length=64, unique=True)
        contact = models.ForeignKey('UserGroup', verbose_name='业务联系人', related_name='c')
        manager = models.ForeignKey('UserGroup', verbose_name='系统管理员', related_name='m')
    
        class Meta:
            verbose_name_plural = "业务线表"
    
        def __str__(self):
            return self.name
    
    
    class IDC(models.Model):
        """
        机房信息
        """
        name = models.CharField('机房', max_length=32)
        floor = models.IntegerField('楼层', default=1)
    
        class Meta:
            verbose_name_plural = "机房表"
    
        def __str__(self):
            return self.name
    
    
    class Tag(models.Model):
        """
        资产标签
        """
        name = models.CharField('标签', max_length=32, unique=True)
    
        class Meta:
            verbose_name_plural = "标签表"
    
        def __str__(self):
            return self.name
    
    
    
    class Server(models.Model):
        """
        服务器信息
        """
        device_type_choices = (
            (1, '服务器'),
            (2, '交换机'),
            (3, '防火墙'),
        )
        device_status_choices = (
            (1, '上架'),
            (2, '在线'),
            (3, '离线'),
            (4, '下架'),
        )
    
        device_type_id = models.IntegerField('服务器类型',choices=device_type_choices, default=1)
        device_status_id = models.IntegerField('服务器状态',choices=device_status_choices, default=1)
    
        cabinet_num = models.CharField('机柜号', max_length=30, null=True, blank=True)
        cabinet_order = models.CharField('机柜中序号', max_length=30, null=True, blank=True)
    
        idc = models.ForeignKey('IDC', verbose_name='IDC机房', null=True, blank=True)
        business_unit = models.ForeignKey('BusinessUnit', verbose_name='属于的业务线', null=True, blank=True)
    
        tag = models.ManyToManyField('Tag')
    
        hostname = models.CharField('主机名',max_length=128, unique=True)
        sn = models.CharField('SN号', max_length=64, db_index=True)
        manufacturer = models.CharField(verbose_name='制造商', max_length=64, null=True, blank=True)
        model = models.CharField('型号', max_length=64, null=True, blank=True)
    
        manage_ip = models.GenericIPAddressField('管理IP', null=True, blank=True)
    
        os_platform = models.CharField('系统', max_length=16, null=True, blank=True)
        os_version = models.CharField('系统版本', max_length=16, null=True, blank=True)
    
        cpu_count = models.IntegerField('CPU个数', null=True, blank=True)
        cpu_physical_count = models.IntegerField('CPU物理个数', null=True, blank=True)
        cpu_model = models.CharField('CPU型号', max_length=128, null=True, blank=True)
    
        create_at = models.DateTimeField(auto_now_add=True, blank=True)
    
        class Meta:
            verbose_name_plural = "服务器表"
    
        def __str__(self):
            return self.hostname
    
    
    class Disk(models.Model):
        """
        硬盘信息
        """
        slot = models.CharField('插槽位', max_length=8)
        model = models.CharField('磁盘型号', max_length=32)
        capacity = models.CharField('磁盘容量GB', max_length=32)
        pd_type = models.CharField('磁盘类型', max_length=32)
        server_obj = models.ForeignKey('Server',related_name='disk')
    
        class Meta:
            verbose_name_plural = "硬盘表"
    
        def __str__(self):
            return self.slot
    
    
    class NIC(models.Model):
        """
        网卡信息
        """
        name = models.CharField('网卡名称', max_length=128)
        hwaddr = models.CharField('网卡mac地址', max_length=64)
        netmask = models.CharField(max_length=64)
        ipaddrs = models.CharField('ip地址', max_length=256)
        up = models.BooleanField(default=False)
        server_obj = models.ForeignKey('Server',related_name='nic')
    
    
        class Meta:
            verbose_name_plural = "网卡表"
    
        def __str__(self):
            return self.name
    
    
    class Memory(models.Model):
        """
        内存信息
        """
        slot = models.CharField('插槽位', max_length=32)
        manufacturer = models.CharField('制造商', max_length=32, null=True, blank=True)
        model = models.CharField('型号', max_length=64)
        capacity = models.FloatField('容量', null=True, blank=True)
        sn = models.CharField('内存SN号', max_length=64, null=True, blank=True)
        speed = models.CharField('速度', max_length=16, null=True, blank=True)
    
        server_obj = models.ForeignKey('Server',related_name='memory')
    
    
        class Meta:
            verbose_name_plural = "内存表"
    
        def __str__(self):
            return self.slot
    
    class AssetRecord(models.Model):
        """
        资产变更记录,creator为空时,表示是资产汇报的数据。
        """
        asset_obj = models.ForeignKey('Server', related_name='ar')
        content = models.TextField(null=True)# 新增硬盘
        creator = models.ForeignKey('UserProfile', null=True, blank=True) #
        create_at = models.DateTimeField(auto_now_add=True)
    
    
        class Meta:
            verbose_name_plural = "资产记录表"
    
        def __str__(self):
            return "%s-%s-%s" % (self.asset_obj.idc.name, self.asset_obj.cabinet_num, self.asset_obj.cabinet_order)
    
    
    class ErrorLog(models.Model):
        """
        错误日志,如:agent采集数据错误 或 运行错误
        """
        asset_obj = models.ForeignKey('Server', null=True, blank=True)
        title = models.CharField(max_length=16)
        content = models.TextField()
        create_at = models.DateTimeField(auto_now_add=True)
    
        class Meta:
            verbose_name_plural = "错误日志表"
    
        def __str__(self):
            return self.title
    models.py
    然后执行数据迁移的命令python manage.py makemigrations   python manage.py migrate

    使用django后台admin进行录入数据,在admin中进行注册
    from django.contrib import admin
    
    # Register your models here.
    from repository import models
    admin.site.register(models.Server)
    admin.site.register(models.UserProfile)
    admin.site.register(models.UserGroup)
    admin.site.register(models.BusinessUnit)
    admin.site.register(models.IDC)
    admin.site.register(models.Tag)
    admin.site.register(models.Disk)
    admin.site.register(models.Memory)
    admin.site.register(models.NIC)
    admin.site.register(models.AssetRecord)
    admin.site.register(models.ErrorLog)
    admin.py

    创建超级用户createsuperuser

    进入到admin后台管理进行数据录入








  • 相关阅读:
    How Do I Enable Remote Access To MySQL Database Server?
    超越MySQL:三个流行MySQL分支的对比
    自动杀死UNIX僵死的进程 红联Linux门户 中国领先的Linux技术网站 网站导航 Linux企业应用 UniX技术文章
    公司简介_关于我们_知阅网——免费借阅,送还上门
    超越MySQL:三个流行MySQL分支的对比
    reviewboard升级
    Implementing Regular Expressions
    乐维UP IT领域的社交问答
    Price Comparison Script
    Kill the undesired UNIX processes in one go
  • 原文地址:https://www.cnblogs.com/huangxuanya/p/11631987.html
Copyright © 2011-2022 走看看