运维前线:一线运维专家的运维方法、技巧与实践2.6 高级进阶
2.6.1 历史查询功能
操作历史,应该是管理系统必备的功能之一。Django-echelon就是一个很好的功能模块,该功能模块可以单独使用于任何的Django项目中,非常方便,接下来我们讲解如何将该功能添加到CMDB系统中,设置步骤具体如下。
(1)修改settings.py设置。
①添加echelon APP:
INSTALLED_APPS = (
......,
echelon,
)
②添加echelon中间件:
MIDDLEWARE_CLASSES = (
......,
echelon.middleware.EchelonMiddleware,
)
(2)修改urls.py设置:
# encoding:utf8
from django.conf.urls import patterns, include, url
urlpatterns = patterns(,
......,
# 操作历史
url(r^cmdb/changelog/, include(echelon.urls)),
)
(3)将echelon代码复制到Django项目的主目录中,将html代码复制到templates目
录中。
(4)刷新DB,创建数据表:
$ python manage.py syncdb
(5)把操作历史的URL信息添加到前端页面的导航栏中就可以了(配置cmdb/cmdb_menu.py程序),具体操作如下:
CMDB_TOP_MENU = [
......,
#导航名称、URL、图标、子导航信息
[u操作历史 , /cmdb/changelog/, time, []],
]
(6)启动Django服务,打开前端页面,然后点击操作历史,就可以看到用户的操作信息了(见图2-14),具体如下。
图2-14 用户的操作信息
以上代码都可以在open-cmdb库上找到源代码。
2.6.2 API功能
CMDB作为一个数据源中心,很多运维工具都会调用CMDB数据进行使用,因此API接口就非常有必要了,由于各个系统的需求不一样,从头到尾开发一套适用于各个系统的CMDB API也比较困难,那么有没有什么简单的方法呢?答案肯定是有,这里我推荐Django API利器Django REST framework。
Django REST framework是一个非常强大、灵活的API构建工具,它能很容易、很快速地帮我们构建Web API。下面来讲解构建的过程,具体步骤如下。
(1)安装Django REST framework。
主要安装3个模块:djangorestframework、markdown、django-filter。具体代码如下:
pip install djangorestframework
pip install markdown
pip install django-filter
(2)配置settings.py:
INSTALLED_APPS = (
......,
rest_framework,
)
REST_FRAMEWORK = {
# Use Djangos standard `django.contrib.auth` permissions,
# or allow read-only access for unauthenticated users.
DEFAULT_PERMISSION_CLASSES: [
rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly
]
}
(3)设置urls.py:
urlpatterns += patterns(
,
url(r^api/, include(myproject.api.router.urls)),
url(r^api-auth/, include(rest_framework.urls, namespace=rest_framework)),
)
(4)创建我们的CMDB API(根据models信息来创建,这里只附上一个简单的讲解,具体的内容请看源码):
# -*- coding: utf-8 -*-
# 导入cmdb.models模块
import cmdb.models
# 从rest_framework中导入模块
from rest_framework import routers, serializers, viewsets
# 给需要生成API的model定义一个数据序列
# Serializers define the API representation.
class IDCSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
# 使用的model名称
model = cmdb.models.IDC
# 字段序列
fields = (url, name, memo)
# 定义视图
class IDCViewSet(viewsets.ModelViewSet):
# 查询所有数据,这个可以根据自己的需要来展示几个
queryset = cmdb.models.IDC.objects.all()
# 序列化信息
serializer_class = IDCSerializer
# 配置路由注册,自动生成API URL
# Routers provide an easy way of automatically determining the URL conf.
router = routers.DefaultRouter()
router.register(ridcs, IDCViewSet)
(5)配置导航栏信息:
cmdb_menu.py CMDB_TOP_MENU = [ [uAPI文档 , /api/, book, []], ]
(6)启动Django服务,展示如下(图2-15)。
图2-15 启动Django服务
通过API文档,可以看到全部的API信息,如图2-16所示。
图2-16 全部的API信息
点击IDC的具体URL,就能看到展示的信息和用法,如图2-17所示。
到这里CMDB API就完成了最基本的功能,后续还需要读者自己去调整页面和授
权等。
图2-17 展示的信息和用法
2.6.3 数据表结构
对于数据表结构,前面的定义是比较简单的,有兴趣的读者可以根据自己的实际需求去增加,这里仅列举一个简单的优化例子——IDC表优化。
IDC表前面就一个IDC名称字段,这里将根据作者所在公司的需求来做优化,优化后的字段具体如下:
class IDC(models.Model):
# 机房名称字段
name = models.CharField(u机房名称, max_length=200, unique=True)
# 名称缩写
short_name = models.CharField(u名称缩写, max_length=200, unique=True)
# 机房地域
zone = models.CharField(u机房地域, max_length=200, blank=True)
# 机房地域缩写
zone_short_name = models.CharField(u地域缩写, max_length=200, blank=True)
# 机房地址
address = models.CharField(u机房地址, max_length=200, blank=True)
# 机柜U数
unit_size = models.PositiveIntegerField(u机柜U数, default=42, help_text="机房每个机柜拥有Unit数目")
# 机柜电数
power_size = models.PositiveIntegerField(u机柜电数, default=12, help_text="机房每个机柜拥有电力(An)数目")
INTERFACE_TYPE_CHOICES = (
(0, 光纤),
(1, 普通),
(2, 其他),
)
# 网络接入方式是光纤、普通还是其他
interface_type = models.SmallIntegerField(
网络接入, choices=INTERFACE_TYPE_CHOICES, default=0)
# 机房所有设备的总带宽
bandwidth_equipment = models.BigIntegerField(u设备带宽, default=0, help_text="设备带宽(Mbps)")
# 机房可用带宽
bandwidth_usable = models.BigIntegerField(u可用带宽, default=0, help_text="可使用最大带宽(Mbps)")
# 物理接入带宽
bandwidth_line = models.BigIntegerField(u接入带宽, default=0, help_text="物理接入带宽(Mbps)")
# 保底带宽
bandwidth_min = models.BigIntegerField(u保底带宽, default=0, help_text="保底带宽(Mbps)")
# 报警阀值
bandwidth_threshold = models.BigIntegerField(u报警阈值, default=0, help_text="报警阈值(Mbps)")
LINE_MODEL_CHOICES = (
(0, 单线),
(1, 双线),
(2, BGP),
)
# 机房线路类型是单线、双线还是BGP
line_model = models.SmallIntegerField(
线路类型, choices=LINE_MODEL_CHOICES, default=0)
# 接入线路条数
line_count = models.IntegerField(u线路条数, default=1, help_text="接入线路条数")
# 是否冗余
line_redundancy = models.BooleanField("是否冗余", default=False, help_text="接入线路是否冗余")
# 是否限速,限速大小
speed_limit = models.IntegerField(u限速大小, default=0, help_text="限速大小(Mbps, 0:不限速)")
CHARGE_TYPE_CHOICES = (
(0, 峰值),
(1, 95值),
(2, 保底),
(3, 计时),
(4, 包月),
(5, 包年),
)
# 计费模式
charge_type = models.SmallIntegerField(
计费模式, choices=CHARGE_TYPE_CHOICES, default=0)
# 是否直连ISP
isp_direct_link = models.BooleanField("是否直连ISP", default=False)
# 所属运营商,这里需要再建立一个ISP的类
isp = models.ForeignKey("ISP", verbose_name="运营商")
# 联系人
contact = models.ForeignKey(UserProfile, related_name="idc_contact", verbose_name="联系人", help_text="IDC机房联系人")
# IDC经理
manager = models.ForeignKey(UserProfile, related_name="idc_manager", verbose_name="经理", help_text="IDC经理")
# 值班人
duty_officer = models.ForeignKey(UserProfile, related_name="duty_officer", verbose_name="值班人", help_text="IDC机房值班联系人")
# IDC报障邮箱
support_email = models.EmailField(u报障邮箱, help_text="IDC报障邮箱")
# 公司联系人
company_contact = models.ForeignKey(UserProfile, related_name="xsj_contact", verbose_name="公司联系人", help_text="公司联系人")
# 开通时间
start_time = models.DateTimeField(u开通时间,
auto_now_add=True)
# 到期时间
end_time = models.DateTimeField(u到期时间,
default=datetime.datetime(2140, 1, 1, 0, 0, 1))
memo = models.CharField(u备注, max_length=200, blank=True)
def __unicode__(self):
return self.name
class Meta:
db_table = idc
现在这个表结构就是一个复杂的数据表结构,通过修改base_admin.py就可以直接展示了。
2.6.4 用户管理功能
Django有一套自己的用户管理、用户组管理和权限管理,我们在初始化Django项目的时候,Django会默认创建User、Permission、Group这3个表及对应的关联关系表。
本章所介绍的这套简单的CMDB系统,已经将展示、添加、编辑和删除都模块化了。通过模板构建用户管理也是一件很轻松的事情,只需要把Django自带的用户信息提取出来套用模板即可,具体步骤如下。
(1)在cmdb/base_admin.py中设置。
导入User模块:
from django.contrib.auth.models import User
user: {
# model名称
model: User,
# form表单
form: User_CheckFrom,
#名称 name: u用户管理 ,
#是否可以导入信息
import: ,
# table展示字段
list_display: [username,
password, email, is_superuser, is_active, is_staff,
groups,
user_permissions],
#编辑只读字段
readonly: [username],
#动作
action_list: [(u编辑 , pencil, /cmdb/user/modify/),]
},
(2)把用户管理的URL信息添加到前端页面的导航栏中。(配置cmdb/cmdb_menu.py程序),具体操作如下:
CMDB_TOP_MENU = [
......,
#导航名称、URL、图标、子导航信息
[u用户管理 , /cmdb/user/show/, user, []],
]
(3)启动Django服务,打开前端页面,点击用户管理,信息如图2-18所示。
图2-18 用户组管理信息
(4)到这里一个简单的用户管理功能就实现了,如果读者需要更详细的用户信息,可以去创建一个UserProfile表,然后关联到Django自带的User信息中,限于篇幅,本章就不逐一详细介绍了。
2.6.5 用户组管理功能
用户组管理和用户管理的原理是相通的,添加方式也是一样的,这里只是简述讲解一下添加的步骤。
(1)在cmdb/base_admin.py中设置:
group: {
# model名称
model: Group,
# form表单
form: Group_CheckFrom,
# 名称
name: u用户组管理,
# 是否可以导入信息
import: ,
# table展示字段
list_display: [name,
permissions],
# 编辑只读字段
readonly: [name, ],
# 动作
action_list: [(u编辑, pencil, /cmdb/group/modify/),]
},
(2)把用户组管理的URL信息添加到前端页面的导航栏中就可以了(配置cmdb/cmdb_menu.py程序),具体操作如下:
CMDB_TOP_MENU = [
......,
#导航名称、URL、图标、子导航信息
[u用户组管理 , /cmdb/group/show/, list, []],
]
(3)启动Django服务,打开前端页面,点击用户组管理(默认为空),信息如图2-19所示。
图2-19 添加用户组管理
(4)到这里组管理功能也实现成功了,现在我们就可以创建自己想要的组信息,把相应的用户添加到组中了。
到此为止,我们已经基于CMDB完善了用户、用户组、操作历史、开放API几大实用功能。通过这些构建,可以将CMDB和自动化运维平台的其他系统逐一打通,构建属于自己的平台。
【线下技术沙龙】阿里专家DevOps玩法全揭秘,加速开发运维一体化 阿里巴巴互联网业务催生下的新型研发效能平台——云效,将于9月15日在上海开启“业务为王时代,DevOps怎么玩?”主题沙龙,由三位阿里巴巴技术专家,从“互联网+时代企业级研发效能提升服务”新概念的提出、到阿里巴巴DevOps落地实践,到企业如何利用云效进行高效研发,再到Docker容器平台加速DevOps落地等方面,为企业全面解读DevOps落地实战经验,加速企业 IT精益运营和业务创新能力。
相关文章
- 爬虫 Http请求,urllib2获取数据,第三方库requests获取数据,BeautifulSoup处理数据,使用Chrome浏览器开发者工具显示检查网页源代码,json模块的dumps,loads,dump,load方法介绍
- php操作redis常用方法
- lodash中判断数据类型的方法
- TIF、JPG图片手动添加地理坐标的方法(转载)
- 高管必备思维:区分2类问题和4类可视化方法
- 运维前线:一线运维专家的运维方法、技巧与实践1.8 运维自动化依赖的团队模型
- 运维前线:一线运维专家的运维方法、技巧与实践2.4 如何利用Python获取Facts
- 《软件工程方法与实践》—— 1.6 小结
- Oracle 分区表的新增、修改、删除、合并。普通表转分区表方法
- mfc-钩子的使用方法详解
- setAttribute和setParameter方法的区别
- 使用 SQL 创建公司数据库的最快方法
- ES5和ES6新增的数组方法
- Acunetix Web Vulnerability Scanner使用和生成报告的方法
- C++使用Mysql的详细步骤及各个常用方法的代码演示:select,insert,update,delete
- php使用CURL不依赖COOKIEJAR获取COOKIE的方法
- windows10下找回照片查看器的方法(仅作记录)
- js 的each()方法遍历对象和数组
- weex-怎么定义全局方法
- C#-IO-读写txt文件的两种方法
- 一个shell脚本弄清楚不同运行方法的不同
- NIO基础方法一