CMDB之数据库表结构的设计
生活随笔
收集整理的這篇文章主要介紹了
CMDB之数据库表结构的设计
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
CMDB之?dāng)?shù)據(jù)庫表設(shè)計
1.開發(fā)CMDB的背景
很多公司還在用Excel維護(hù)資產(chǎn)信息,當(dāng)服務(wù)器數(shù)量變多時,難以保證excel表格的正確性,而且不同部門之間交換信息不方便。實現(xiàn)自動采集資產(chǎn),自動匯報,并自動保存變更記錄。
2.CMDB架構(gòu)
- 資產(chǎn)采集(資產(chǎn)采集)
- API(接受數(shù)據(jù)保存入庫,對外提供數(shù)據(jù)接口)
- 后臺管理
3.資產(chǎn)采集方式
三種方案
- agent
- paramiko
- saltstack
4.服務(wù)器的唯一標(biāo)識
a.不需要采集虛擬機(jī)
- 采用主板的SN號作為唯一標(biāo)識。
b.需要采集虛擬機(jī)
- 對服務(wù)器進(jìn)行標(biāo)準(zhǔn)化,唯一標(biāo)識選用hostname
5.CMDB流程
- 裝機(jī)同時,主機(jī)名在CMDB中設(shè)置
- 第一次采集,將主機(jī)名寫入文件,發(fā)送到API
- 第N次采集,主機(jī)名從直接從文件名中獲取。
6.表結(jié)構(gòu)圖示
7.django-models結(jié)構(gòu)
from django.db import models
class UserProfile(models.Model):
"""
用戶信息
"""
name = models.CharField(u'姓名', max_length=32)
email = models.EmailField(u'郵箱')
phone = models.CharField(u'座機(jī)', max_length=32)
mobile = models.CharField(u'手機(jī)', max_length=32)
class Meta:
verbose_name_plural = "用戶表"
def __str__(self):
return self.name
class AdminInfo(models.Model):
"""
用戶登陸相關(guān)信息
"""
user_info = models.OneToOneField("UserProfile")
username = models.CharField(u'用戶名', max_length=64)
password = models.CharField(u'密碼', max_length=64)
class Meta:
verbose_name_plural = "管理員表"
def __str__(self):
return self.user_info.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):
"""
業(yè)務(wù)線,業(yè)務(wù)聯(lián)系人和系統(tǒng)管理員
"""
name = models.CharField('業(yè)務(wù)線', max_length=64, unique=True)
contact = models.ForeignKey('UserGroup', verbose_name='業(yè)務(wù)聯(lián)系人', related_name='c')
manager = models.ForeignKey('UserGroup', verbose_name='系統(tǒng)管理員', related_name='m')
class Meta:
verbose_name_plural = "業(yè)務(wù)線表"
def __str__(self):
return self.name
class IDC(models.Model):
"""
機(jī)房信息
"""
name = models.CharField('機(jī)房', max_length=32)
floor = models.IntegerField('樓層', default=1)
class Meta:
verbose_name_plural = "機(jī)房表"
def __str__(self):
return self.name
class Tag(models.Model):
"""
資產(chǎn)標(biāo)簽
"""
name = models.CharField('標(biāo)簽', max_length=32, unique=True)
class Meta:
verbose_name_plural = "標(biāo)簽表"
def __str__(self):
return self.name
class Asset(models.Model):
"""
資產(chǎn)信息表,所有資產(chǎn)公共信息(交換機(jī),服務(wù)器,防火墻等)
"""
device_type_choices = (
(1, '服務(wù)器'),
(2, '交換機(jī)'),
(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('機(jī)柜號', max_length=30, null=True, blank=True)
cabinet_order = models.CharField('機(jī)柜中序號', max_length=30, null=True, blank=True)
idc = models.ForeignKey('IDC', verbose_name='IDC機(jī)房', null=True, blank=True)
business_unit = models.ForeignKey('BusinessUnit', verbose_name='屬于的業(yè)務(wù)線', null=True, blank=True)
tag = models.ManyToManyField('Tag')
latest_date = models.DateField(null=True)
create_at = models.DateTimeField(auto_now_add=True)
class Meta:
verbose_name_plural = "資產(chǎn)表"
def __str__(self):
return "%s-%s-%s" % (self.idc.name, self.cabinet_num, self.cabinet_order)
class Server(models.Model):
"""
服務(wù)器信息
"""
asset = models.OneToOneField('Asset')
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('系統(tǒng)', max_length=16, null=True, blank=True)
os_version = models.CharField('系統(tǒng)版本', max_length=16, null=True, blank=True)
cpu_count = models.IntegerField('CPU個數(shù)', null=True, blank=True)
cpu_physical_count = models.IntegerField('CPU物理個數(shù)', 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 = "服務(wù)器表"
def __str__(self):
return self.hostname
class NetworkDevice(models.Model):
asset = models.OneToOneField('Asset')
management_ip = models.CharField('管理IP', max_length=64, blank=True, null=True)
vlan_ip = models.CharField('VlanIP', max_length=64, blank=True, null=True)
intranet_ip = models.CharField('內(nèi)網(wǎng)IP', max_length=128, blank=True, null=True)
sn = models.CharField('SN號', max_length=64, unique=True)
manufacture = models.CharField(verbose_name=u'制造商', max_length=128, null=True, blank=True)
model = models.CharField('型號', max_length=128, null=True, blank=True)
port_num = models.SmallIntegerField('端口個數(shù)', null=True, blank=True)
device_detail = models.CharField('設(shè)置詳細(xì)配置', max_length=255, null=True, blank=True)
class Meta:
verbose_name_plural = "網(wǎng)絡(luò)設(shè)備"
class Disk(models.Model):
"""
硬盤信息
"""
slot = models.CharField('插槽位', max_length=8)
model = models.CharField('磁盤型號', max_length=32)
capacity = models.FloatField('磁盤容量GB')
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):
"""
網(wǎng)卡信息
"""
name = models.CharField('網(wǎng)卡名稱', max_length=128)
hwaddr = models.CharField('網(wǎng)卡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 = "網(wǎng)卡表"
def __str__(self):
return self.name
class Memory(models.Model):
"""
內(nèi)存信息
"""
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('內(nèi)存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 = "內(nèi)存表"
def __str__(self):
return self.slot
class AssetRecord(models.Model):
"""
資產(chǎn)變更記錄,creator為空時,表示是資產(chǎn)匯報的數(shù)據(jù)。
"""
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 = "資產(chǎn)記錄表"
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采集數(shù)據(jù)錯誤 或 運行錯誤
"""
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 = "錯誤日志表"
def __str__(self):
return self.title
總結(jié)
以上是生活随笔為你收集整理的CMDB之数据库表结构的设计的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python中h5文件制作与读取
- 下一篇: java常见证书类型和密钥库类型