CMDB数据库表设计

 

CMDB数据库表设计:

Server表:
    asset = models.OneToOneField('Asset')
    主机名(hostname)
    sn号(sn)
    制造商(manufacture)
    系统(os_platform)
    系统版本(os_version)
    CPU个数(cpu_count)
    CPU版本(cpu_model)
    创建的时间(ctime)
Disk表:
    插槽位(slot)
    磁盘型号(model)
    磁盘容量(capacity)
    磁盘类型(pd_type)
    对server的外键(server_obj)
Nic(网卡信息)表:
    网卡名称(nic_name)
    mac地址(hwaddr)
    子网掩码(netmask)
    ip地址(ipaddr)
    对server的外键(server_obj)
Memory(内存)表:
    插槽位(slot)
    型号(model)
    容量(capacity)
    内存sn号(sn)
    对server的外键(server_obj)

server表除了上述的信息之外,我们是不是还得增加一下,这个server是放置在哪个机柜的哪一层上,因此我们需要给server表增加如下的两个字段

cabinet_num (机柜号)
cabinet_order(机柜中序号)

那此时又来一个问题,上面只是我们采集的server的信息,那如果我们还要采集交换机,路由器的信息呢?我们是不是还得搞一张网络设备的表吧,结构如下:

NetWorkDevice表:

asset = models.OneToOneField('Asset')
management_ip (管理IP)
vlan_ip (VlanIP)
intranet_ip (内网IP)
sn (SN号)
manufacture (制造商)

那此时,又出现了和上面server表一样的问题,是不是还得加上这个设备放置在哪个机柜的哪一层上,因此我们是不是又得给NetWorkDevice表增加如下的两个字段

cabinet_num (机柜号)
cabinet_order(机柜中序号)

如此这般,我们思考一下,我们能不能把这些相同的属性抽离出来呢,在搞成一张单独的表,并和上面的server表和NetWorkDevice表做一个一对一的关联

Asset表:
    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)
    product_line = models.ForeignKey('ProductLine', verbose_name='属于的业务线', null=True, blank=True)
    create_at = models.DateTimeField(auto_now_add=True)

接下来我们在思考,我们的服务器或者说其他的网络设备,是不是应该分配给我们的产品线使用,因此,我们是不是需要一个产品线表

ProductLine:
    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')
IDC:
    name = models.CharField('机房', max_length=32)
    floor = models.IntegerField('楼层', default=1)

接下来,就是该考虑一下这个业务线是不是应该有个管理员或者说业务线的联系人,这样的话,出了事情我们可以联系到

UserProfile:
    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)

按道理来说,我们的业务线应该关联的是我们的UserProfile表,但是由于我们需要有一个备选的人员,因此我们还需要一个组,以后我们的业务线只需要关联组就OK了

UserGroup:
    name = models.CharField(max_length=32, unique=True)
    users = models.ManyToManyField('UserProfile')

除了上述的几张表之外,我们还需要如下的表

class AssetRecord(models.Model):
    """
    资产变更记录,creator为空时,表示是资产汇报的数据。
    """
    asset_obj = models.ForeignKey('Asset', 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 = "资产记录表"
class ErrorLog(models.Model):
    """
    错误日志,如:agent采集数据错误 或 运行错误
    """
    asset_obj = models.ForeignKey('Asset', 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 = "错误日志表"

所有的表信息如下(共11张表)

from django.db import models


# Create your models here.


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', on_delete=models.CASCADE)
    manager = models.ForeignKey('UserGroup', verbose_name='系统管理员', related_name='m', on_delete=models.CASCADE)

    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, on_delete=models.CASCADE)
    business_unit = models.ForeignKey(
        'BusinessUnit', verbose_name='属于的业务线', null=True, blank=True, on_delete=models.CASCADE
    )

    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', on_delete=models.CASCADE)

    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', on_delete=models.CASCADE)

    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', on_delete=models.CASCADE)

    class Meta:
        verbose_name_plural = "内存表"

    def __str__(self):
        return self.slot


class AssetRecord(models.Model):
    """
    资产变更记录,creator为空时,表示是资产汇报的数据。
    """
    asset_obj = models.ForeignKey('Server', related_name='ar', on_delete=models.CASCADE)
    content = models.TextField(null=True)  # 新增硬盘
    creator = models.ForeignKey('UserProfile', null=True, blank=True, on_delete=models.CASCADE)
    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, on_delete=models.CASCADE)
    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
View Code

注册所有的表

from repository import models

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.Server)
admin.site.register(models.Disk)
admin.site.register(models.NIC)
admin.site.register(models.Memory)
admin.site.register(models.AssetRecord)
admin.site.register(models.ErrorLog)

 

posted @ 2019-11-14 17:31  tiger_li  阅读(579)  评论(0)    收藏  举报