学神python全栈学习笔记CMDB系统---第一章 python_cmdb_介绍,项目开始
第一章 python_cmdb_介绍,项目开始
本节所讲内容:
1.1 python cmdb系统介绍与需求分析
1.2 python cmdb数据库建模
1.3 python cmdb前端基础搭建
1.1 python cmdb系统介绍与需求分析
CMDB(配置管理数据库)存储与管理企业IT架构中设备的各种配置信息,它与所有服务支持和服务交付流程都紧密相联,支持这些流程的运转、发挥配置信息的价值,同时依赖于相关流程保证数据的准确性。
上面是对cmdb系统的介绍,但是我们的cmdb项目要比定义当中的cmdb具有更加完备的功能
我们cmdb系统具备以下的功能:
- 数据添加
- 数据查询/搜索
- 自动收集服务器信息
- 服务器远程操作
- 数据可视化展示
- 监控数据接口提供
- 权限控制
- 数据导出
- 生成CSV格式,
所以说我们创建的cmdb系统是一个收集服务器基础信息,实现服务器信息可视化,为自动化运维数据监控、数据统计、提供数据基础的系统
首先cmdb的对外的关联图
然后我们看一下cmdb系统结构图
1.2 python cmdb数据库建模
通过navicat建模
建表
服务器
基本服务器信息
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 :
apicid
initial_apicid
fpu
fpu_exception
cpuid_level
wp
flags
bogomips
clflush_size
cache_alignment
address_sizes
power_management
服务器内存详细信息
MemTota
MemFree
MemAvailable
Buffers
Cached
SwapCached
Active
Inactive
Active(anon)
Inactive(anon)
Active(file)
Inactive(file)
Unevictable
Mlocked
SwapTotal
SwapFree
Dirty
Writeback
AnonPages
Mapped
Shmem
Slab
SReclaimable
SUnreclaim
KernelStack
PageTables
NFS_Unstable
Bounce
WritebackTmp
CommitLimit
Committed_AS
VmallocTotal
VmallocUsed
VmallocChunk
HardwareCorrupted
AnonHugePages
HugePages_Total
HugePages_Free
HugePages_Rsvd
HugePages_Surp
Hugepagesize
DirectMap4k
DirectMap2M
DirectMap1G
用户
用户必要信息
Username
Password
用户选填信息
Nickname
Phone
photo
接口
接口信息
Name
Description
Doc 给链接
1.3 python cmdb前端基础搭建
检查centos的python,切换到3.6上
[[email protected]_server_test .ssh]# rm -rf /usr/bin/python
[[email protected]_server_test .ssh]# ln -s /usr/local/python3.6/bin/python3.6 /usr/bin/python
[[email protected]_server_test .ssh]#
[[email protected]_server_test .ssh]#
[[email protected]_server_test .ssh]# python
Python 3.6.2 (default, Sep 16 2017, 19:38:07)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-18)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
[3]+ Stopped python
[[email protected]_server_test .ssh]#
[[email protected]_server_test .ssh]#
[[email protected]_server_test .ssh]#
[[email protected]_server_test .ssh]#
[[email protected]_server_test .ssh]# pip -V
pip 10.0.1 from /usr/local/python3.6/lib/python3.6/site-packages/pip (python 3.6)
[[email protected]_server_test .ssh]# pip install django==1.11.1 安装指定版本的django
[[email protected]_server_test .ssh]# pip install Pillow 安装指定版本的Pillow
Requirement already satisfied: Pillow in /usr/local/python3.6/lib/python3.6/site-packages (5.2.0)
[[email protected]_server_test .ssh]# pip install django-ckeditor==5.3.0 安装指定版本的django-ckeditor
1、创建项目
- 在pycharm上设置远程在centos环境上建立django项目
- 创建app目录
cd XueGodCMDB
python manage.py startapp Service
python manage.py startapp Users
python manage.py startapp Api
3、创建静态文件目录
4、保存静态文件
5、进行数据库orm建模
在我们项目的models当中创建模型
在django当中数据建模分为两种
- 中小型项目可以直接用django自带的外键和多对多关系进行数据关联
2、在中大型项目由于开发需求多变,多数项目采用自定义表关系
class Service(models.Model): ''' 服务器基本信息 ''' ip = models.CharField(max_length=64, verbose_name='服务器ip地址') mac = models.CharField(max_length=64, verbose_name='服务器mac地址') cpu = models.CharField(max_length=64, verbose_name='服务器cpu') memory = models.CharField(max_length=64, verbose_name='服务器内存') disk = models.CharField(max_length=64, verbose_name='服务器磁盘') hostname = models.CharField(max_length=64, verbose_name='服务器名称', null=True) isalive = models.CharField(max_length=64, verbose_name='服务器状态') class Meta: db_table = '服务器基本信息表' verbose_name = '服务器基本信息' verbose_name_plural = verbose_name class Cpu(models.Model): ''' 服务器cpu详细信息 null用于数字和日期类型为空 blank用于字符类型为空 ''' 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=48, 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) cache_size = models.CharField(max_length=32, blank=True, null=True) physical_id = models.CharField(max_length=32, blank=True, null=True) siblings = models.CharField(max_length=32, blank=True, null=True) core_id = models.CharField(max_length=32, blank=True, null=True) cpu_cores = models.CharField(max_length=32, blank=True, null=True) apicid = models.CharField(max_length=32, blank=True, null=True) initial_apicid = models.CharField(max_length=32, blank=True, null=True) fpu = models.CharField(max_length=32, blank=True, null=True) fpu_exception = models.CharField(max_length=32, blank=True, null=True) cpuid_level = models.CharField(max_length=32, blank=True, null=True) wp = models.CharField(max_length=32, blank=True, null=True) flags = models.CharField(max_length=256, blank=True, null=True) bogomips = models.CharField(max_length=32, blank=True, null=True) clflush_size = models.CharField(max_length=32, blank=True, null=True) cache_alignment = models.CharField(max_length=32, blank=True, null=True) address_sizes = models.CharField(max_length=48, blank=True, null=True) power_management = models.CharField(max_length=32, blank=True, null=True) class Meta: db_table = '服务器CPU详细信息表' verbose_name = '服务器CPU详细信息' verbose_name_plural = verbose_name class Memory(models.Model): ''' 服务器内存详细信息 ''' MemTotal = 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) SwapFree = models.CharField(max_length=32, blank=True, null=True) Dirty = models.CharField(max_length=32, blank=True, null=True) Writeback = models.CharField(max_length=32, blank=True, null=True) AnonPages = models.CharField(max_length=32, blank=True, null=True) Mapped = models.CharField(max_length=32, blank=True, null=True) Shmem = models.CharField(max_length=32, blank=True, null=True) Slab = models.CharField(max_length=32, blank=True, null=True) SReclaimable = models.CharField(max_length=32, blank=True, null=True) SUnreclaim = models.CharField(max_length=32, blank=True, null=True) KernelStack = models.CharField(max_length=32, blank=True, null=True) PageTables = models.CharField(max_length=32, blank=True, null=True) NFS_Unstable = models.CharField(max_length=32, blank=True, null=True) Bounce = models.CharField(max_length=32, blank=True, null=True) WritebackTmp = models.CharField(max_length=32, blank=True, null=True) CommitLimit = models.CharField(max_length=32, blank=True, null=True) Committed_AS = models.CharField(max_length=32, blank=True, null=True) VmallocTotal = models.CharField(max_length=32, blank=True, null=True) VmallocUsed = models.CharField(max_length=32, blank=True, null=True) VmallocChunk = models.CharField(max_length=32, blank=True, null=True) HardwareCorrupted = models.CharField(max_length=32, blank=True, null=True) AnonHugePages = models.CharField(max_length=32, blank=True, null=True) HugePages_Total = models.CharField(max_length=32, blank=True, null=True) HugePages_Free = models.CharField(max_length=32, blank=True, null=True) HugePages_Rsvd = models.CharField(max_length=32, blank=True, null=True) HugePages_Surp = models.CharField(max_length=32, blank=True, null=True) Hugepagesize = models.CharField(max_length=32, blank=True, null=True) DirectMap4k = models.CharField(max_length=32, blank=True, null=True) DirectMap2M = models.CharField(max_length=32, blank=True, null=True) DirectMap1G = models.CharField(max_length=32, blank=True, null=True) class Meta: db_table = '服务器内存详细信息表' verbose_name = '服务器内存详细信息' verbose_name_plural = verbose_name class Service_Cpu(models.Model): ''' 服务器cpu关联表 ''' service_id = models.IntegerField() cpu_id = models.IntegerField() class Meta: db_table = '服务器cpu关联表' verbose_name = '服务器cpu关联' verbose_name_plural = verbose_name class Service_Memory(models.Model): ''' 服务器内存关联表 ''' service_id = models.IntegerField() memory_id = models.IntegerField() class Meta: db_table = '服务器内存关联表' verbose_name = '服务器内存关联' verbose_name_plural = verbose_name
我们两种结合
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='接口文档') def __str__(self): return self.name class Meta: verbose_name = 'CMDB接口数据模型' verbose_name_plural = verbose_name db_table = 'CMDB Api接口数据表'
常识:
State: 比较常用,各种状态都可以用它,但是它更着重于一种心理状态或者物理状态。
Status: 用在人的身上一般是其身份和地位,作“状态,情形”讲时,多指政治和商业。
我们可以把 State 作为表名,里面含有各种状态,代表着本身(自己)是一个集合。
而 Status 作为字段名,里面也含有各种状态,但代表的是主体(其他东西)的状态。
6、完成settings基本配置
Settings:
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
这是Python1.6版本之后添加出来的配置,就是动态的指向项目根目录的一个配置
加载App
其中前三项是我们自定义的应用
后两项是ckeditor的应用
指定HTML文件存放目录
数据库配置(远程centos环境上需要提前安装好mysql环境,并创建好红框标注的数据库)
语言与事件的配置
静态文件和媒体文件配置
大家经常出现的问题就是静态文件加载不是,表现没有前端样式
- 请检测STATICFILES_DIRS是否正确
- 请检测元组是不是加了逗号
App静态文件加载位置、Ckeditor配置
配置ckeditor的路由
收集ckeditor的静态文件
python manage.py collectstatic
选择yes
在这里我们为了测试配置的效果,我们将我们的数据表安装到admin后台当中
然后同步数据库,同时启动项目
- 校验配置
- 进行数据库同步
查看效果:
完成静态页面样式,尽量完成静态页
- 完成模板页
1、指出base页,这里是blank.html
视图文件
url路由指出
现在出现页面,没有静态文件显示
判断样式路径有问题,开始修改路径
修改之后得到效果
在进行HTML修改的过程当中学会结合浏览器的f12和编译器的代码折叠
样式修改完成
进行模板设置
模板设置常用块儿
- 标题块儿 要有默认值,如果标题没有写,也有默认值
<title>
{% block title %}
学神CMDB管理系统
{% endblock %}
</title>
样式块儿 目的是为了给各自页(继承页)添加自己的样式
内容块儿 用来存放内容,可以分成多个块儿
比如当前
<div id="page-wrapper">
<div class="container-fluid">
<div class="row">
<div class="col-lg-12">
<h1 class="page-header">
{% block label %}
Blank
{% endblock %}
</h1>
</div>
<!-- /.col-lg-12 -->
</div>
<!-- /.row -->
{% block content %}
{% endblock %}
</div>
<!-- /.container-fluid -->
</div>
js脚本块儿
js在HTML当中拥有先后顺序,后加载的可以导入先加载的,比如vue.js依赖jq,所以我们写导入先导入jq,再导入vue.js
还有部分js写在我们HTML页面的<scripts>标签当中,那么这个没有顺序,这个执行顺序依赖js代码编写
{% block script %}
{% endblock %}
进行模板加载,代码在此:
XueGodCMDB/template/index.html
{% extends "blank.html" %} <!-- 这个标签的参数需要加引号 -->
{% block title %}
学神CMDB系统-首页
{% endblock %}
{% block label %}
学神CMDB系统-首页
{% endblock %}
{% block content %}
这是我的首页
{% endblock %}
{% block script %}
<script>
$(
function () {
alert("hello world")
}
)
</script>
{% endblock %}
XueGodCMDB/ XueGodCMDB /view.py
#coding:utf-8
from django.shortcuts import render_to_response
def index(request):
return render_to_response("index.html")
XueGodCMDB/ XueGodCMDB /urls.py
from XueGodCMDB.views import index
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
url(r'^ckeditor/', include("ckeditor_uploader.urls")),
url(r'^index/', index),
]
效果如下:
总结
1.1 python cmdb系统介绍与需求分析
1.2 python cmdb数据库建模
1.3 python cmdb前端基础搭建