前一节已经梳理了cmdb需要存储的信息,根据这些信息设计数据库表结构。
首先创建一个Django项目,在项目models.py中编写数据库表结构
class Memory(models.Model):
'''内存'''
size=models.CharField(max_length=32, blank=True, null=True, verbose_name='内存/G')
width=models.CharField(max_length=8, blank=True, null=True, verbose_name='位数')
locator=models.CharField(max_length=16, blank=True, null=True, verbose_name='插槽')
type=models.CharField(max_length=16, blank=True, null=True, verbose_name='内存类型')
def __str__(self):
return self.size
class Meta:
verbose_name_plural = "内存表"
class Disk(models.Model):
'''磁盘'''
path = models.CharField(max_length=64, blank=True, null=True, verbose_name='挂载路径')
size = models.CharField(max_length=16, blank=True, null=True, verbose_name='磁盘大小/G')
remarks = models.CharField(max_length=2048, blank=True, null=True, verbose_name='备注')
def __str__(self):
return self.size
class Meta:
verbose_name_plural = "磁盘表"
class Os(models.Model):
'''系统'''
name=models.CharField(max_length=16, blank=True, null=True, verbose_name='系统名称')
def __str__(self):
return self.name
class Meta:
verbose_name_plural = "操作系统表"
class Login(models.Model):
'''登录相关'''
login_name = models.CharField(max_length=16, default='root', verbose_name='登录用户名')
login_pwd= models.CharField(max_length=64, blank=True, null=True, verbose_name='登录密码')
auth=models.CharField(max_length=8,blank=True, null=True, verbose_name='具有权限')
def __str__(self):
return self.login_name
class Meta:
verbose_name_plural = "主机用户表"
class Lable(models.Model):
#标签
name = models.CharField(max_length=16, blank=True, null=True, verbose_name='标签')
def __str__(self):
return self.name
class Meta:
verbose_name_plural = "标签"
class Host(models.Model):
'''主机,阿里云eth0 内网网卡, eth1 公网网卡'''
hostname= models.CharField(max_length=64, blank=True, null=True, verbose_name='阿里云主机名')
ecsname= models.CharField(max_length=64, blank=True, null=True, verbose_name='阿里云实例ID')
logining=models.ManyToManyField(to='Login',blank=True, null=True, verbose_name='授权用户')
login_port = models.CharField(max_length=16, default='22',blank=True, null=True, verbose_name='ssh登录端口')
cpu= models.CharField(max_length=8,blank=True, null=True, verbose_name='CPU')
lab= models.ForeignKey(to='Lable',blank=True, null=True, verbose_name='标签')
mem= models.CharField(max_length=8,blank=True, null=True, verbose_name='内存/M')
speed = models.CharField(max_length=8,blank=True, default='5',null=True, verbose_name='带宽/M')
disks= models.ManyToManyField(to='Disk', blank=True, null=True, verbose_name='磁盘')
eth1_network= models.CharField(max_length=32, blank=True, null=True, verbose_name='公网IP')
eth0_network= models.CharField(max_length=32,verbose_name='私网IP')
sn= models.CharField(max_length=64, blank=True, null=True, verbose_name='sn')
os= models.ForeignKey(to='Os', blank=True, null=True, verbose_name='操作系统') #os+版本号
kernel= models.CharField(max_length=64, blank=True, null=True, verbose_name='系统内核') #内核+版本号
the_upper=models.ForeignKey(to='Host',blank=True,null=True,verbose_name='宿主机',related_name='upper')
source=models.ForeignKey(to='Source',blank=True,null=True,verbose_name='来源类型')
remarks = models.CharField(max_length=2048, blank=True, null=True, verbose_name='备注')
createtime = models.CharField(max_length=32, blank=True, null=True, verbose_name='创建时间')
expirytime = models.CharField(max_length=32, blank=True, null=True, verbose_name='到期时间')
state_choices=(
(1,'Running'),
(2,'下线'),
(3,'关机'),
(4,'删除'),
)
state = models.SmallIntegerField(verbose_name='主机状态', choices=state_choices,blank=True,null=True,)
def __str__(self):
return self.eth0_network
class Meta:
verbose_name_plural = "主机表"
class Source(models.Model):
'''来源:阿里云、物理机(某机房等)'''
name=models.CharField(max_length=16,blank=True,null=True,verbose_name='来源')
def __str__(self):
return self.name
class Meta:
verbose_name_plural = "主机来源表"
表机构可以根据自己实际情况修改
urls.py中配置路由信息
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^login/$', views.Login.as_view()),
url(r'^host/', include('host.urls')), #使用多级url
]
在项目中新建一个host的app,手动创建一个urls.py文件,内容如下:
from host import views
urlpatterns = [
url(r'list$', views.List.as_view()), #使用CBV,该urls会和上个urls拼接为host/list
url(r'add$', views.Add.as_view()),
url(r'edit/(\d+)/', views.Edit.as_view()),
url(r'delete', views.Delete.as_view()),
]
这样就设计好了cmdb的请求路由。主机的增删改查请求分别路由到host/add、host/delete、host/edit和host/list路径,然后经过后端的class类处理请求。
views.py文件中的内容如下:
from django.shortcuts import render,redirect,HttpResponse
from django.views import View
from demo import models
class List(View):
def post(self,request,*args,**kwargs):
pass
def get(self,request,*args,**kwargs):
host_list=models.Host.objects.all()
return render(request,'host.html',locals())
class Add(View):
def post(self,request,*args,**kwargs):
pass
def get(self,request,*args,**kwargs):
pass
class Edit(View):
def post(self,request,*args,**kwargs):
pass
def get(self,request,*args,**kwargs):
get_id = int(request.GET.get('id'))
obj = models.Host.objects.filter(id=get_id).first()
return redirect('host/list')
class Del(View):
def post(self,request,*args,**kwargs):
pass
def get(self,request,*args,**kwargs):
get_id = int(request.GET.get('id'))
models.Host.objects.filter(id=get_id).delete()
return redirect('host/list')
创建几个类来实现增删改查功能,具体代码以后完善
然后在html中显示查询数据,显示到页面中
host.html代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>主机管理</title>
</head>
<body>
<a href="/host/add">添加</a> {#点击跳转到添加主机页面#}
<div class="container">
<table class="table table-bordered table-hover" id="table">
<thead>
<tr>
<th></th>
<th> 主机名 </th>
<th> CPU </th>
<th> 内存 </th>
<th> 带宽 </th>
<th> IP </th>
<th> 来源类型 </th>
<th> 状态 </th>
<th> 编辑 </th>
<th> 删除 </th>
</tr>
</thead>
<tbody>
{% for host in host_list %}
<tr>
<td>{{ host.id }}</td>
<td>{{ host.hostname }}</td>
<td>{{ host.cpu }}</td>
<td>{{ host.mem }}</td>
<td>{{ host.speed }}</td>
<td>{{ host.eth0_network }}</td>
<td>{{ host.source.name }}</td>
<td>{{ host.get_state_display }}</td>
<td><a href="/host/edit/{{ host.id }}/">编辑</a> </td> {#根据选中的设备id跳转到编辑页面#}
<td><a href="/host/del?id={{ host.id }}">删除</a> </td> {#根据选中的设备id实现删除操作#}
</tr>
{% endfor %}
</tbody>
</table>
</div>
</body>
</html>
这样简单实现了设备信息的显示和添加、编辑、删除的页面跳转,编辑和删除需要根据选中的id来进行操作。