CMDB(配置管理数据库)存储与管理企业IT架构中设备的各种配置信息,它与所有服务支持和服务交付流程都紧密相联,支持这些流程的运转、发挥配置信息的价值,同时依赖于相关流程保证数据的准确性。
上面是对cmdb系统的介绍,但是我们的cmdb项目要比定义当中的cmdb具有更加完备的功能
我们cmdb系统具备以下的功能:
1、 数据添加
2、 数据查询/搜索
3、 自动收集服务器信息
4、 服务器远程操作
5、 数据可视化展示
6、 监控数据接口提供
7、 权限控制
8、 数据导出
9、 生成CSV格式
所以说我们创建的cmdb系统是一个收集服务器基础信息,实现服务器信息可视化,为自动化运维数据监控、数据统计、提供数据基础的系统。
首先cmdb的对外的关联图:
然后我们再看一下cmdb系统结构图:
我们首先通过Visio画个图来了解一下服务器CPU,服务器内存,服务器用户三个主题之间的关系:
服务器
服务器的基本信息
ip
mac
cpu
memory
disk
isalive
服务器cpu详细信息
processor
vendor_id
cpu_family
model
model_name
stepping
microcode
cpu_MHz
cache_size
physical_id
siblings
core_id
cpu_cores
......
服务器内存的详细信息
MemTota
MemFree
MemAvailable
Buffers
Cached
SwapCached
Active
Inactive
Active(anon)
Inactive(anon)
Active(file)
......
用户
用户必要信息
uername
password
用户的选填信息
nickname
phone
email
photo
接口
接口信息
name
description
doc (接口文档)
首先我们的开发环境需要准备好:
Python 3.5
Django 1.8.2 : pip install django==1.8.2
Pillow : pip install pillow
Django-ckeditor:pip install django-ckeditor
django-admin startproject ALLENCMDB
cd .\ALLENCMDB
python3 .\manage.py startapp server
python3 .\manage.py startapp User
python3 .\manage.py startapp Api
3. 创建静态文件目录
4. 保存静态文件
还是老样子,我们将模板文件中的静态文件和网页模板导入到项目中的静态文件夹。
这是我的项目所用到的模板
链接:https://pan.baidu.com/s/1vj0Lszgu_9GJFXe9Wm0AOg
提取码:avc0
5. 数据库orm的建模
在我们项目的models当中创建模型
在django当中数据建模分为两种
我们在\ALLENCMDB\Server\models.py
中编写我们的数据表结构
1、中小型项目可以直接用django自带的外键和多对多关系进行数据关联
class CMDBUser(models.Model):
'''
cmdb系统用户信息
一个用户可以对应多台服务器,一台服务器可以有多个用户
所以他们之间是多对多关系
'''
username = models.CharField(max_length=32,verbose_name='用户账号')
password = models.CharField(max_length=32,verbose_name='用户密码')
nickname = models.CharField(max_length=32,verbose_name='用户姓名')
phone = models.CharField(max_length=32,verbose_name='用户手机号')
email = models.EmailField(verbose_name='用户邮箱')
photo = models.ImageField(verbose_name='用户头像',upload_to='images')
service = models.ManyToManyField(Server) #通过这个字段创建关联
2、在中大型项目由于开发需求多变,多数项目采用自定义表关系
这些表的定义,没有什么多说的,就是把你需要的信息作为关键字进行数据库建表,方便后期的信息录入,以下就是数据库建表的代码:
class Server(models.Model):
'''
服务器基本信息
'''
ip = models.CharField(max_length=32,verbose_name='服务器ip')
mac = models.CharField(max_length=32,verbose_name='服务器物理地址')
cpu = models.CharField(max_length=32,verbose_name='服务器CPU')
memory = models.CharField(max_length=32,verbose_name='服务器内存')
disk = models.CharField(max_length=32,verbose_name='服务器磁盘')
isalive = models.CharField(max_length=32,verbose_name='服务器状态')
class Cpu(models.Model):
'''
服务器CPU详细信息
'''
processor = models.CharField(max_length=32,blank=True,null=True)
vendor_id = models.CharField(max_length=32,blank=True,null=True)
cpu_family = models.CharField(max_length=32,blank=True,null=True)
model = models.CharField(max_length=32,blank=True,null=True)
model_name = models.CharField(max_length=32,blank=True,null=True)
stepping = models.CharField(max_length=32,blank=True,null=True)
microcode = models.CharField(max_length=32,blank=True,null=True)
cpu_MHz = models.CharField(max_length=32,blank=True,null=True)
class Memory(models.Model):
'''
服务器内存详细信息
'''
MemTota = models.CharField(max_length=32,blank=True,null=True)
MemFree = models.CharField(max_length=32,blank=True,null=True)
MemAvailable = models.CharField(max_length=32,blank=True,null=True)
Buffers = models.CharField(max_length=32,blank=True,null=True)
Cached = models.CharField(max_length=32,blank=True,null=True)
SwapCached = models.CharField(max_length=32,blank=True,null=True)
Active = models.CharField(max_length=32,blank=True,null=True)
Inactive = models.CharField(max_length=32,blank=True,null=True)
Active_anon = models.CharField(max_length=32,blank=True,null=True)
Inactive_anon = models.CharField(max_length=32,blank=True,null=True)
Active_file = models.CharField(max_length=32,blank=True,null=True)
Inactive_file = models.CharField(max_length=32,blank=True,null=True)
Unevictable = models.CharField(max_length=32,blank=True,null=True)
Mlocked = models.CharField(max_length=32,blank=True,null=True)
SwapTotal = models.CharField(max_length=32,blank=True,null=True)
class Server_Cpu(models.Model):
'''
服务器与CPU关联
'''
server_id = models.IntegerField()
cpu_id = models.IntegerField()
class Server_memory(models.Model):
'''
服务器与内存关联
'''
server_id = models.IntegerField()
memory_id = models.IntegerField()
我们两种结合
这里我们注意要导入富文本编辑器
from ckeditor_uploader.fields import RichTextUploadingField
class Api(models.Model):
"""
CMDB接口数据模型
"""
name = models.CharField(max_length = 32,verbose_name = "接口名称")
description = RichTextUploadingField(verbose_name = "接口描述") #采用富文本编辑器编写的接口描述字段
doc = models.CharField(max_length = 64,verbose_name = "接口文档")
3、 完成settings基本配置
Settings:
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
这是Python1.6版本之后添加出来的配置,就是动态的指向项目根目录的一个配置
加载App
其中前三项是我们自定义的应用
后两项是ckeditor的应用
指定HTML文件存放目录
数据库配置,我们选择Python自带sqlite数据库,如果你需要其他数据库,按照要求配置连接。
语言与事件的配置
静态文件配置
大家经常出现的问题就是静态文件加载不对,表现没有前端样式
1、 请检测STATICFILES_DIRS是否正确,有没有加“S”
2、 请检测元组是不是加了逗号
媒体配置
App静态文件加载位置(注意这里需要在static目录下手动建立ckeditor,不然等会收集静态文件时会报错)
Ckeditor配置
配置ckeditor的路由
收集ckeditor的静态文件
python manage.py collectstatic
选择yes
在这里我们为了测试配置的效果,我们将我们的数据表安装到admin后台当中
然后同步数据库,同时启动项目
1、 校验配置
python manage.py validate
python manage.py makemigrations
3、 进行数据库同步
python manage.py syncdb
项目第一次同步在django1.4之后会询问是否创建后台超级用户
访问我们Django后台如图:
完成模板页
1、指出base页,这里是base.html
我将所有的模板文件放进一个文件夹以方便使用,然后新建一个base.html文件作为模板
视图文件
路由指出
现在我们打开页面是有问题的,没有加载样式
所以接下来我们需要修改其中的静态文件路径
然后我们再次访问,刷新页面后就正常啦。
进行模板设置
模板设置常用块儿
1、 标题块儿
要有默认值,如果标题没有写,也有要默认值
2、 样式块儿
目的是为了给各自页(继承页)添加自己的样式
3、 内容块儿
用来存放内容,可以分成多个块儿
比如当前
4、 js脚本块儿
js在HTML当中有先后顺序,后加载的可以导入先加载的,比如vue.js依赖jq,所以我们写导入先导入jq,再导入vue.js
还有部分js写在我们HTML页面的标签当中,那么这个没有顺序,这个执行顺序依赖js代码编写
2、 进行模板加载
代码在此:
index.html
{% extends "base.html" %}
{% block title %}
ALLEN CMDB系统-首页
{% endblock %}
{% block label %}
ALLEN CMDB系统-首页
{% endblock %}
{% block content %}
这是我的首页
{% endblock %}
{% block script %}
{% endblock %}
\ALLENCMDB\ALLENCMDB\views.py
#coding:utf-8
from django.shortcuts import render_to_response
def index(request):
return render_to_response("index.html")