Python之路【第二十二篇】CMDB项目

浅谈ITIL

TIL即IT基础架构库(Information Technology Infrastructure Library, ITIL,信息技术基础架构库)由英国政府部门CCTA(Central Computing and Telecommunications Agency)在20世纪80年代末制订,现由英国商务部OGC(Office of Government Commerce)负责管理,主要适用于IT服务管理(ITSM)。ITIL为企业的IT服务管理实践提供了一个客观、严谨、可量化的标准和规范

ITIL 就是一个标准规范,他并不是一个软件和系统,举例来说如果想自己构建一个IT服务的系统可以按照这个规范去实现。有一个指定方针!

ITIL分为以下内容

1、事件管理(Incident Management)

事故管理负责记录、归类和安排专家处理事故并监督整个处理过程直至事故得到解决和终止。事故管理的目的是在尽可能最小地影响客户和用户业务的情况下使IT系统恢复到服务级别协议所定义的服务级别。

注释:故障申报处理模块,出现故障把事故给相应的人去处理!一步一步的解决!

2、问题管理(Problem Management)

问题管理是指通过调查和分析IT基础架构的薄弱环节、查明事故产生的潜在原因,并制定解决事故的方案和防止事故再次发生的措施,将由于问题和事故对业务产生的负面影响减小到最低的服务管理流程。与事故管理强调事故恢复的速度不同,问题管理强调的是找出事故产生的根源,从而制定恰当的解决方案或防止其再次发生的预防措施。

注释:类似知识库、提供一些帮助,定位问题和预防的措施。

3、配置管理(Configuration Management)

配置管理是识别和确认系统的配置项,记录和报告配置项状态和变更请求,检验配置项的正确性和完整性等活动构成的过程,其目的是提供IT基础架构的逻辑模型,支持其它服务管理流程特别是变更管理和发布管理的运作。

注释:识别和确认系统的配置项,配置项可以是硬件、也可以是软件!

如果是硬件:一个主机、一个硬盘、一个鼠标都可以是配置项。

如果是软件:比如公司购买的软件

做的CMDB就是ITIL的“配置管理”,SaltStack最明显的作用就是批量管理,还有一个作用就是配置管理,他可以把你的机器配置成你想要的状态!你想要这个机器配置什么服务、什么软件!这也可以叫配置管理!

这个配置管理可以看做CMDB的中的一项功能

4、变更管理(Change Management)

变更管理是指为在最短的中断时间内完成基础架构或服务的任一方面的变更而对其进行控制的服务管理流程。变更管理的目标是确保在变更实施过程中使用标准的方法和步骤,尽快地实施变更,以将由变更所导致的业务中断对业务的影响减小到最低。

注释:我的理解是举例来说:在服务器需要替换的时候、修改主机名、这个都需要流程化、标准化。

5、发布管理(Release Management)

发布管理是指对经过测试后导入实际应用的新增或修改后的配置项进行分发和宣传的管理流程。发布管理以前又称为软件控制与分发

注释:代码发布,它可以做为一个独立的系统!

 

如果想在公司做自动化,按照这个5大块来做就不会偏离自动化偏离太远,ITIL真正实施的很少因为很大!不过我们可以借鉴它来参考去做我们自动化的东西!

上面5大块具体实现的目标:

'''
事件管理的目标是在不影响业务的情况下,尽可能快速的恢复服务,从而保证最佳的效率和服务的可持续性。事件管理流程的建立包括事件分类,确定事件的优先级和建立事件的升级机制。

问题管理是调查基础设施和所有可用信息,包括事件数据库,来确定引起事件发生的真正潜在原因,一起提供的服务中可能存在的故障。

配置管理的目标是:定义和控制服务与基础设施的部件,并保持准确的配置信息。

变更管理的目标是:以受控的方式,确保所有变更得到评估、批准、实施和评审。

发布管理的目标是:在实际运行环境的发布中,交付、分发并跟踪一个或多个变更。

服务台:服务台是IT部门和IT服务用户之间的单一联系点。它通过提供一个集中和专职的服务联系点促进了组织业务流程与服务管理基础架构集成。服务台的主要目标是协调客户(用户)和IT部门之间的联系,为IT服务运作提供支持,从而提高客户的满意度。
服务台:以上的流程是我们运维和研发同学在后台实现的,如果要后期要交给其他用户,就需要一个入口。完整的前端结合!
'''

CMDB介绍

CMDB --Configuration Management Database 配置管理数据库, CMDB存储与管理企业IT架构中设备的各种配置信息,它与所有服务支持和服务交付流程都紧密相联,支持这些流程的运转、发挥配置信息的价值,同时依赖于相关流程保证数据的准确性。

在实际的项目中,CMDB常常被认为是构建其它ITIL流程的基础而优先考虑,ITIL项目的成败与是否成功建立CMDB有非常大的关系。
70%~80%的IT相关问题与环境的变更有着直接的关系。实施变更管理的难点和重点并不是工具,而是流程。即通过一个自动化的、可重复的流程管理变更,使得当变更发生的时候,有一个标准化的流程去执行,能够预测到这个变更对整个系统管理产生的影响,并对这些影响进行评估和控制。而变更管理流程自动化的实现关键就是CMDB。

为什么70%~80%的IT现骨干问题与环境的变更有着直接的关系,举例来说,如果在交大的公司中比如百度,比如两个部门的一个是百度地图一个是百度贴吧!因为如果系统比较庞大的话,没有一个人能完完全全的了解整个系统的架构,如果在这种情况下,百度地图的同学修改了一个借口,那么他不知道是否影响百度贴吧。万一百度贴吧有调用呢!所以在这种情况下就需要一个存储着整个系统架构和对应关系的系统,记录着它们之间的关系映射!

所以CMDB中至少包含如下的功能:整合、调和、同步、映射和可视化。

  • 整合是指能够充分利用来自其他数据源的信息,对CMDB中包含的记录源属性进行存取,将多个数据源合并至一个视图中,生成连同来自CMDB和其他数据源信息在内的报告;
  • 调和能力是指通过对来自每个数据源的匹配字段进行对比,保证CMDB中的记录在多个数据源中没有重复现象,维持CMDB中每个配置项目数据源的完整性;自动调整流程使得初始实施、数据库管理员的手动运作和现场维护支持工作降至最低;
  • 同步指确保CMDB中的信息能够反映联合数据源的更新情况,在联合数据源更新频率的基础上确定CMDB更新日程,按照经过批准的变更来更新 CMDB,找出未被批准的变更;
  • 应用映射与可视化,说明应用间的关系并反应应用和其他组件之间的依存关系,了解变更造成的影响并帮助诊断问题。

并且在做自动化的前提是标准化,我们在做CMDB的时候就相当于做标准化的过程,并能仅仅告诉研发和运维同学怎么怎么做,如果没有一个系统强制要求他这样做那么之前的流程和标准对于运维和研发来说他们已经习惯了,是很难实施的!

自动化的前提就是标准化和流程化!

CMDB自定义用户认证

自己创建一个表,做一个one-to-one去管理User表,相当于扩展它!就相当于有两张表.一个是Django自带的表一个是我扩展的表,所以在查询的时候比较麻烦!看下面代码

#!/usr/bin/env python
#-*- coding:utf-8 -*-

from __future__ import unicode_literals
from django.db import models
from django.contrib.auth.models import User
#必须导入User模块
class UserProfile(models.Model):
    '''
    用户表
    '''
    #使用Django提供的用户表,直接继承就可以了.在原生的User表里扩展!(原生的User表里就有用户名和密码)
    #一定要使用OneToOne,如果是正常的ForeignKey的话就表示User中的记录可以对应UserProfile中的多条记录!
    #并且OneToOne的实现不是在SQL级别实现的而是在代码基本实现的!
    user = models.OneToOneField(User)
    #名字
    name = models.CharField(max_length=32)
    #属组
    groups = models.ManyToManyField("UserGroup")
    #朋友
    friends = models.ManyToManyField('self',related_name='my_friends')
    status = models.ForeignKey("UserStatus",related_name='user_status',blank=True,null=True)

并且在调用的时候还需要去调用这个User表而不是直接调用UserProfile

{{ request.user.userprofile.name }}

那现在我要就写一张表有两种方式
1 完全自己写
2 或者是说在Django的基础上先继承在扩展,上面的方式就直接是集成没有扩展
如果是简单的项目的话,就使用One-To-One的直接继承就行了.
如果是大项目的话建议使用第二种方式.既然是自定义的话里面很多都需要自己写

#!/usr/bin/env python
#-*- coding:utf-8 -*-
from django.db import models
from django.contrib.auth.models import (
    BaseUserManager, AbstractBaseUser
)


class UserProfileManager(BaseUserManager):
    def create_user(self, email, name, password=None):
        """
        Creates and saves a User with the given email, date of
        birth and password.
        """
        if not email:
            raise ValueError('Users must have an email address')

        user = self.model(
            email=self.normalize_email(email),
            name=name,
        )

        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, email, name, password):
        """
        Creates and saves a superuser with the given email, date of
        birth and password.
        """
        user = self.create_user(email,
            password=password,
            name=name
        )
        user.is_admin = True
        user.save(using=self._db)
        return user

class UserProfile(AbstractBaseUser):
    email = models.EmailField(
        verbose_name='email address',
        max_length=255,
        unique=True,
    )
    name = models.CharField(max_length=32)
    is_active = models.BooleanField(default=True)
    is_admin = models.BooleanField(default=False)

    objects = UserProfileManager()
    #USERNAME_FIELD 告诉Django那个为用户名字段
    USERNAME_FIELD = 'email'
    #指定必须字段,用户名默认就是必须字段了,我们在指定一个必须字段
    REQUIRED_FIELDS = ['name']

    def get_full_name(self):
        # The user is identified by their email address
        return self.email

    def get_short_name(self):
        # The user is identified by their email address
        return self.email

    def __str__(self):              # __unicode__ on Python 2
        return self.email

    #这个方法是用来控制admin的权限的
    def has_perm(self, perm, obj=None):
        "Does the user have a specific permission?"
        # Simplest possible answer: Yes, always
        return True
    #用来判断是否有权限查看其他app的默认返回True
    def has_module_perms(self, app_label):
        "Does the user have permissions to view the app `app_label`?"
        # Simplest possible answer: Yes, always
        return True
    #静态方法,默认返回self.
    @property
    def is_staff(self):
        "Is the user a member of staff?"
        # Simplest possible answer: All admins are staff
        return self.is_admin

并且我们创建的表,Django默认去Django的Model里去找,如果不想放进Model里面而是自己写的表的话
怎么办?Django默认还是自己的认证表,我们的明确的告诉Django不要用你自己的表了用我的表!
在哪里改呢?在setting里指定!

AUTH_USER_MODEL = 'assets.UserProfile'

并且在model里引入

from assets.user_models import UserProfile

现在在注册admin之后有个问题,就是当我们注册了admin之后我们在修改密码之后发现
在修改密码之后,密码是明文的了!如下图