运维前线:一线运维专家的运维方法、技巧与实践2.6 高级进阶

简介:

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 Django's 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(r'idcs', IDCViewSet)

(5)配置导航栏信息:

cmdb_menu.py CMDB_TOP_MENU = [ [u'API文档 ', '/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和自动化运维平台的其他系统逐一打通,构建属于自己的平台。

相关文章
|
1月前
|
运维 监控 持续交付
构建高效自动化运维体系:策略与实践
在数字化时代,企业IT基础设施的管理和维护变得日益复杂。为了提高效率、降低错误率并快速响应市场变化,构建一个高效的自动化运维体系至关重要。本文将探讨自动化运维的核心策略,并通过实际案例分析展示如何将这些策略应用于日常管理中,以实现IT运维的优化。
19 0
|
3天前
|
运维 监控 安全
构建高效自动化运维体系:策略与实践
【4月更文挑战第25天】在数字化转型的浪潮中,企业IT基础设施日趋复杂多变,传统的手动运维模式已难以满足快速响应和高效管理的需求。本文探讨了构建一个高效自动化运维体系的关键环节,并结合实际案例分析,提出了一系列切实可行的策略与实践方法。文章着重分析了自动化工具选择、流程设计优化以及持续监控的重要性,并讨论了如何通过这些手段降低运维成本,提升系统稳定性和安全性。
|
13天前
|
运维 Kubernetes Devops
构建高效自动化运维体系:DevOps与容器技术融合实践
【4月更文挑战第15天】 在当今快速发展的信息技术时代,传统的IT运维模式已难以满足业务敏捷性的需求。本文旨在探讨如何通过整合DevOps理念和容器技术来构建一个高效的自动化运维体系。文章将详细阐述DevOps的核心原则、容器技术的基础知识,以及两者结合的优势。此外,文中还将分享一系列实践经验,包括持续集成/持续部署(CI/CD)流程的搭建、微服务架构的应用,以及监控和日志管理策略的优化,以期帮助企业实现快速、可靠且安全的软件交付过程。
|
14天前
|
人工智能 运维 监控
构建高效自动化运维体系的实践与思考
【4月更文挑战第14天】在数字化转型的浪潮中,自动化运维作为提升系统稳定性和效率的关键手段,受到了企业的广泛关注。本文将深入探讨如何构建一个高效的自动化运维体系,涵盖从基础设施的搭建到流程的优化等多个方面。通过分析当前自动化运维的挑战及解决方案,文章旨在为读者提供一套实用的策略框架,帮助企业实现运维工作的高效化、标准化和智能化。
|
19天前
|
运维 监控 Kubernetes
构建高效自动化运维体系的实践与思考
【4月更文挑战第8天】在数字化时代,IT基础设施的复杂性日益增加,传统的手工运维模式已经难以满足快速响应和高效率的需求。本文将探讨如何通过自动化工具和策略构建一个高效的自动化运维体系,旨在提高系统的稳定性、减少人为错误以及优化资源分配。文章首先分析了自动化运维的必要性,接着介绍了实现自动化的关键技术和工具,并通过案例分析展示自动化运维体系的实际效果。最后,对自动化运维的未来发展趋势进行了展望。
|
22天前
|
机器学习/深度学习 传感器 运维
提升数据中心效能:智能运维策略与实践
【4月更文挑战第6天】在数字化时代,数据中心作为企业信息架构的核心,其稳定性和效率直接影响到业务连续性和客户满意度。随着技术的进步,传统的数据中心运维模式已经不能满足现代高效、智能化的需求。本文将探讨如何通过智能运维(AIOps)策略,结合大数据分析和机器学习技术,实现数据中心的自动化管理、故障预测及快速响应,以提升整体效能并降低运营成本。
|
1月前
|
运维 监控 数据可视化
现代化运维管理系统的关键特性及实践应用
随着信息技术的迅猛发展,现代企业对于运维管理系统的需求日益增长。本文将探讨现代化运维管理系统的关键特性,以及在实际应用中的重要性和优势所在,帮助企业更好地理解和应用现代化运维管理系统。
15 2
|
1月前
|
运维 Prometheus 监控
构建高效稳定的云基础设施:自动化运维策略与实践
在动态的云计算环境中,自动化运维(AIOps)已成为确保服务稳定性和效率的关键。本文将深入探讨构建高效稳定云基础设施的策略,重点关注自动化工具的选择、配置管理的最佳实践、持续集成与持续部署(CI/CD)流程的优化,以及监控和日志分析的重要性。通过这些策略的实施,企业能够减少人为错误,提高响应速度,并最终实现运维效率的显著提升。
|
1月前
|
运维 监控 Devops
构建高效自动化运维体系:基于容器技术的持续集成与持续部署实践
在数字化转型的浪潮中,企业的IT基础设施和软件交付模式正经历着深刻的变革。传统的运维方式已难以满足快速迭代、灵活扩展的现代业务需求。本文将探讨如何通过容器技术实现高效的自动化运维体系,重点分析持续集成(CI)与持续部署(CD)的实践方法及其对企业运维效率的影响。通过引入微服务架构、容器编排、DevOps文化等概念,我们旨在为读者提供一套全面的自动化运维解决方案,以支持业务的敏捷性和可扩展性。
|
1月前
|
机器学习/深度学习 人工智能 运维
构建高效自动化运维体系的探索与实践
【2月更文挑战第30天】 在信息技术迅猛发展的今天,企业对于IT系统的依赖日益加深。随之而来的是运维工作的复杂性和难度不断上升,传统的手动运维模式已经难以满足快速响应和高效率的需求。本文旨在探讨如何构建一个高效的自动化运维体系,以提升系统稳定性、降低人为错误并优化资源配置。文中将详细介绍自动化运维的核心组件,包括配置管理、持续集成与持续部署(CI/CD)、监控告警以及故障自愈等,并通过实际案例分析自动化运维实施过程中的关键考量因素和挑战。