CMDB介绍

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

在实际的项目中,CMDB常常被认为是构建其它ITIL流程的基础而优先考虑,ITIL项目的成败与是否成功建立CMDB有非常大的关系。
70%~80%的IT相关问题与环境的变更有着直接的关系。实施变更管理的难点和重点并不是工具,而是流程。即通过 一个自动化的、可重复的流程管理变更,使得当变更发生的时候,有一个标准化的流程去执行,能够预测到这个变更对整个系统管理产生的影响,并对这些影响进行 评估和控制。而变更管理流程自动化的实现关键就是CMDB。
CMDB工具中至少包含这几种关键的功能:整合、调和、同步、映射和可视化。
  • 整合是指能够充分利用来自其他数据源的信息,对CMDB中包含的记录源属性进行存取,将多个数据源合并至一个视图中,生成连同来自CMDB和其他数据源信息在内的报告;
  • 调和能力是指通过对来自每个数据源的匹配字段进行对比,保证CMDB中的记录在多个数据源中没有重复现象,维持CMDB中每个配置项目数据源的完整性;自动调整流程使得初始实施、数据库管理员的手动运作和现场维护支持工作降至最低;
  • 同步指确保CMDB中的信息能够反映联合数据源的更新情况,在联合数据源更新频率的基础上确定CMDB更新日程,按照经过批准的变更来更新 CMDB,找出未被批准的变更;
  • 应用映射与可视化,说明应用间的关系并反应应用和其他组件之间的依存关系,了解变更造成的影响并帮助诊断问题。

CMDB 资产管理部分实现

需求

  • •存储所有IT资产信息
  • •数据可手动添加
  • •硬件信息可自动收集
  • •硬件信息可自动变更
  • •可对其它系统灵活开放API
  • •API接口安全认证

立业之本:定义表结构

  • 各种硬件都能存
  • 资产变更有纪录
  • 资产ID永不变
  • 资产要有状态机

重中之重:接口设计好

  • 可对内外灵活开放接口
  • 接口定义要标准化
  • 一定要提供排错依据
  • 数据返回要标准
  • 要能增删改查
  • 所有异常要抓住
  • 接口安全要注意

  

CMDB资产数据自动汇报及更新流程图

https://www.processon.com/view/link/571b4b2ce4b049474cc87feb

自定义用户认证

https://docs.djangoproject.com/en/1.9/topics/auth/customizing/#django.contrib.auth.models.PermissionsMixin.has_perms

  1. user_models.py
  2. #!/usr/bin/env python
  3. #_*_ coding:utf-8 _*_
  4.  
  5. from django.db import models
  6. from django.contrib.auth.models import (
  7. BaseUserManager, AbstractBaseUser
  8. )
  9.  
  10. class UserProfileManager(BaseUserManager):
  11. def create_user(self, email, name, password=None):
  12. """
  13. Creates and saves a User with the given email, date of
  14. birth and password.
  15. """
  16. if not email:
  17. raise ValueError('Users must have an email address')
  18.  
  19. user = self.model(
  20. email=self.normalize_email(email),
  21. name=name,
  22. )
  23.  
  24. user.set_password(password)
  25. user.save(using=self._db)
  26. return user
  27.  
  28. def create_superuser(self, email, name, password):
  29. """
  30. Creates and saves a superuser with the given email, date of
  31. birth and password.
  32. """
  33. user = self.create_user(email,
  34. password=password,
  35. name=name
  36. )
  37. user.is_admin = True
  38. user.save(using=self._db)
  39. return user
  40.  
  41. class UserProfile(AbstractBaseUser):
  42. email = models.EmailField(
  43. verbose_name='email address',
  44. max_length=255,
  45. unique=True,
  46. )
  47. name = models.CharField(u'名字',max_length=32)
  48. is_active = models.BooleanField(default=True)
  49. is_admin = models.BooleanField(default=False)
  50.  
  51. objects = UserProfileManager()
  52.  
  53. USERNAME_FIELD = 'email'
  54. REQUIRED_FIELDS = ['name']
  55.  
  56. def get_full_name(self):
  57. # The user is identified by their email address
  58. return self.email
  59.  
  60. def get_short_name(self):
  61. # The user is identified by their email address
  62. return self.email
  63.  
  64. def __str__(self): # __unicode__ on Python 2
  65. return self.email
  66.  
  67. def has_perm(self, perm, obj=None):
  68. "Does the user have a specific permission?"
  69. # Simplest possible answer: Yes, always
  70. return True
  71.  
  72. def has_module_perms(self, app_label):
  73. "Does the user have permissions to view the app `app_label`?"
  74. # Simplest possible answer: Yes, always
  75. return True
  76.  
  77. @property
  78. def is_staff(self):
  79. "Is the user a member of staff?"
  80. # Simplest possible answer: All admins are staff
  81. return self.is_admin
  82. class Meta:
  83. verbose_name = u'用户信息'
  84. verbose_name_plural = u"用户信息"
  85. def __unicode__(self):
  86. return self.name
  87.  
  88. ----------------------------------
  89. user_admin_models.py
  90.  
  91. #!/usr/bin/env python
  92. #_*_ coding:utf-8 _*_
  93.  
  94. from django import forms
  95. from django.contrib import admin
  96. from django.contrib.auth.models import Group
  97. from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
  98. from django.contrib.auth.forms import ReadOnlyPasswordHashField
  99.  
  100. from assets.user_models import UserProfile
  101.  
  102. class UserCreationForm(forms.ModelForm):
  103. """A form for creating new users. Includes all the required
  104. fields, plus a repeated password."""
  105. password1 = forms.CharField(label='Password', widget=forms.PasswordInput)
  106. password2 = forms.CharField(label='Password confirmation', widget=forms.PasswordInput)
  107.  
  108. class Meta:
  109. model = UserProfile
  110. fields = ('email', 'name')
  111.  
  112. def clean_password2(self):
  113. # Check that the two password entries match
  114. password1 = self.cleaned_data.get("password1")
  115. password2 = self.cleaned_data.get("password2")
  116. if password1 and password2 and password1 != password2:
  117. raise forms.ValidationError("Passwords don't match")
  118. return password2
  119.  
  120. def save(self, commit=True):
  121. # Save the provided password in hashed format
  122. user = super(UserCreationForm, self).save(commit=False)
  123. user.set_password(self.cleaned_data["password1"])
  124. if commit:
  125. user.save()
  126. return user
  127.  
  128. class UserChangeForm(forms.ModelForm):
  129. """A form for updating users. Includes all the fields on
  130. the user, but replaces the password field with admin's
  131. password hash display field.
  132. """
  133. password = ReadOnlyPasswordHashField()
  134.  
  135. class Meta:
  136. model = UserProfile
  137. fields = ('email', 'password', 'name', 'is_active', 'is_admin')
  138.  
  139. def clean_password(self):
  140. # Regardless of what the user provides, return the initial value.
  141. # This is done here, rather than on the field, because the
  142. # field does not have access to the initial value
  143. return self.initial["password"]
  144.  
  145. class UserAdmin(BaseUserAdmin):
  146. # The forms to add and change user instances
  147. form = UserChangeForm
  148. add_form = UserCreationForm
  149.  
  150. # The fields to be used in displaying the User model.
  151. # These override the definitions on the base UserAdmin
  152. # that reference specific fields on auth.User.
  153. list_display = ('email', 'name', 'is_admin')
  154. list_filter = ('is_admin',)
  155. fieldsets = (
  156. (None, {'fields': ('email', 'password')}),
  157. ('Personal info', {'fields': ('name',)}),
  158. ('Permissions', {'fields': ('is_admin',)}),
  159. )
  160. # add_fieldsets is not a standard ModelAdmin attribute. UserAdmin
  161. # overrides get_fieldsets to use this attribute when creating a user.
  162. add_fieldsets = (
  163. (None, {
  164. 'classes': ('wide',),
  165. 'fields': ('email', 'name', 'password1', 'password2')}
  166. ),
  167. )
  168. search_fields = ('email',)
  169. ordering = ('email',)
  170. filter_horizontal = ()

浅谈Restful API

理解RESTful架构 :http://www.ruanyifeng.com/blog/2011/09/restful

RESTful API 设计指南:http://www.ruanyifeng.com/blog/2014/05/restful_api.html  

如何实现安全的WEB API 接口认证?

MadKing开源CMDB源码

https://github.com/triaquae/MadKing

python--第二十四天总结的更多相关文章

  1. Python第二十四天 binascii模块

    Python第二十四天 binascii模块 binascii用来进行进制和字符串之间的转换 import binascii s = 'abcde' h = binascii.b2a_hex(s) # ...

  2. 孤荷凌寒自学python第二十四天python类中隐藏的私有方法探秘

    孤荷凌寒自学python第二十四天python类中隐藏的私有方法探秘 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 今天发现了python的类中隐藏着一些特殊的私有方法. 这些私有方法不管我 ...

  3. python第二十四天-----作业终于完成啦

    作业 1, ATM:模拟实现一个ATM + 购物商城程序 额度 15000或自定义实现购物商城,买东西加入 购物车,调用信用卡接口结账可以提现,手续费5%支持多账户登录支持账户间转账记录每月日常消费流 ...

  4. python第二十四课——set中的函数

    集合中常用的一些函数: 1.add(obj):追加一个obj元素到集合中 pop():从集合中随机弹出一个元素 remove(obj):删除集合中和obj匹配的元素 clear():清空集合 s1={ ...

  5. 初学 Python(十四)——生成器

    初学 Python(十四)--生成器 初学 Python,主要整理一些学习到的知识点,这次是生成器. # -*- coding:utf-8 -*- ''''' 生成式的作用: 减少内存占有,不用一次性 ...

  6. Python第十四天 序列化 pickle模块 cPickle模块 JSON模块 API的两种格式

    Python第十四天 序列化  pickle模块  cPickle模块  JSON模块  API的两种格式 目录 Pycharm使用技巧(转载) Python第一天  安装  shell  文件 Py ...

  7. 孤荷凌寒自学python第二十五天初识python的time模块

    孤荷凌寒自学python第二十五天python的time模块 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 通过对time模块添加引用,就可以使用python的time模块来进行相关的时间操 ...

  8. 孤荷凌寒自学python第十四天python代码的书写规范与条件语句及判断条件式

    孤荷凌寒自学python第十四天python代码的书写规范与条件语句及判断条件式 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 在我学习过的所有语言中,对VB系的语言比较喜欢,而对C系和J系 ...

  9. NeHe OpenGL教程 第二十四课:扩展

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  10. javaSE第二十四天

    第二十四天    363 1:多线程(理解)    363 (1)JDK5以后的Lock锁    363 A:定义    363 B:方法:    364 C:具体应用(以售票程序为例)    364 ...

随机推荐

  1. python32模拟鼠标和键盘操作

    前言Windows pywin32允许你像vc一样的形式来使用python开发win32应用.代码风格可以类似win32 sdk,也可以类似MFC,由你选择.如果你仍不放弃vc一样的代码过程在pyth ...

  2. 使用阿里云Java SDK 实现 DDNS

    本代码的实现前提: 1.拥有阿里云域名,且获取了Access Key 及 Access Secret 2.能获取外网IP的页面地址(注意:ip138.com的实际包含ip地址为http://2018. ...

  3. English 翻译到Vyeshal的软件

    我或许可以做一个从英语到Vyeshal的翻译软件2333

  4. 极速认识RSS!

    在解释RSS是什么之前,让我先来举个栗子. 大家都能在街道看到许多海报栏.在那里,会贴出各种各样最新的消息,比如哪个系要开讲座了.星期二晚上的电影放什么.二手货转让等 等.只要看一下海报栏,就会对学校 ...

  5. flink入门:01 构建简单运行程序

    1. mac平台安装flink(默认最新版) brew install apache-flink 安装结果: Version 1.7.1, commit ID: 89eafb4 2. jdk版本,我尝 ...

  6. pycharm移动项目文件后,运行报错

    pycharm移动项目文件后,运行报错: ModuleNotFoundError:  No module named 'D:/my_project/my_cases/email139cases/tes ...

  7. 值得推荐的五大敏捷PHP开发框架

    各位开发者,对于在HTML中混乱使用PHP的人来说,我们给大家推荐几款PHP敏捷开发的框架,以及它们为什么能够流行. 在我们开始之前,先了解敏捷开发是个什么东东. 敏捷是一种软件开发方法,每次开发计划 ...

  8. STS临时授权访问OSS

    STS临时授权访问OSS OSS 可以通过阿里云 STS (Security Token Service) 进行临时授权访问.阿里云 STS 是为云计算用户提供临时访问令牌的Web服务.通过 STS, ...

  9. 爬虫之requests

    一.基本用法 1.GET请求 ①r=requests.get(url) --返回Response对象 def get(url, params=None, **kwargs): params={... ...

  10. 嵌入式文件IO实验

    实验步骤: 1.arm-linux-gcc 交叉编译环境的安装.参考网站:https://jingyan.baidu.com/article/9c69d48f80282013c9024e20.html ...