django02_01 CMDB (附源码)

一、CMDB开发流程概述

cmdb根据流程划分为三个部分:服务器,中控机,后台管理。通过中控机与服务器交互,收集所需采集的硬件、服务端相关信息。并将数据传递到后台数据库,由后台管理程序呈现。

1、后台管理

使用django 框架,安装数据库及创建web应用;

创建API 用于中控机的通信,及数据操作;

存储中控机手机到得数据,并向中控机下发通过资产录入 进来的主机列表;

2、中控机

主要进行对服务器的远程操作,及数据采集;

3、服务器

进行数据采集的客户端,按中控机的认证方式完成认证,如保存中控机私钥等;

安装响应的采集命令

-- dmidecode  用于采集内存信息
                -- MegaCli       用于采集硬盘信息

二、环境准备及规划

1、后台管理(应用django1.8.2)


1.1数据库设计

1.1)用户相关表

  • 定义用户类型表,用与用户权限分类:
 class UserType(models.Model):    caption = models.CharField(max_length=32, db_index=True, unique=True)    code = models.CharField(max_length=32, db_index=True, unique=True)

    def __unicode__(self):        return self.caption

    class Meta:        verbose_name_plural = "用户类型"
  • 定义用户存放表
class UserProfile(models.Model):
user_type = models.ForeignKey(‘UserType‘)
#用户创建时需选择响应类型,与UserType表为多对一的关系
name = models.CharField(u‘名字‘, max_length=32)
email = models.EmailField(u‘邮箱‘)
phone = models.CharField(u‘座机‘, max_length=50)
mobile = models.CharField(u‘手机‘, max_length=32)

memo = models.TextField(u‘备注‘, blank=True)
create_at = models.DateTimeField(blank=True, auto_now_add=True)
update_at = models.DateTimeField(blank=True, auto_now=True)

class Meta:
    verbose_name = ‘用户信息‘
    verbose_name_plural = "用户信息"

def __unicode__(self):
    return self.name
  • 定义 AdinInfo/UserGroup表分存放用户名密码、用户分组

1.2)主机信息相关表定义

根据实际情况,定义主机 机柜 机房 主机应用及操作日志等相关表;

1.2 应用程序编写

  • API  url接口程序

web_api主机列表生成函数

def get_untreated_servers():
    response = BaseResponse()
    try:
        current_date = datetime.date.today()
        values = (‘server__hostname‘,)

        condition = Q()

        con_date = Q()
        con_date.connector = ‘OR‘
        con_date.children.append(("latest_date__lt", current_date))
        con_date.children.append(("latest_date", None))

        con_status = Q()
        # 在线状态的服务器(1000:上架;1001:在线)
        con_status.children.append((‘device_status__code‘, ‘1001‘))

        condition.add(con_date, ‘AND‘)
        condition.add(con_status, ‘AND‘)

        result = dal_asset.get_q(condition, *values)
        result = list(result)
        response.status = True
        response.data = result
    except Exception, e:

        response.message = str(e)
    return response
    
    
# ############# 服务器相关信息 #############
class ServerHelper(object):

    # 获取服务器对象
    @staticmethod
    def get_server_obj(sn):
        response = BaseResponse()
        try:
            result = dal_server.get_obj_by_sn(sn)
            if not result:
                raise Exception(‘not found server obj‘)
            response.data = result
            response.status = True
        except Exception,e:
            response.message = e.message
        return response
  • web_api 收到来自中控及信息,进行数据处理,此过程包含大量的数据对比,资源更新 删除 添加等        大量操作程序。

操作基本操作并记录日志,更新相关硬件信息。创建dal包,以操作网卡为示例,如下:

# ############# 操作网卡信息 #############
# 操作网卡,并记录操作日志
# 添加网卡
# 删除网卡
# 更新网卡信息
class HandleNic(object):

    @staticmethod
    def process(server_obj,client_nic,user_obj):
        response = BaseResponse()
        try:
            status = client_nic[‘status‘]
            if status == 0:
                raise Exception(‘nic plugin is error‘)

            client_nic_dict = client_nic[‘data‘]
            nic_objs = dal_nic.get_objs_by_server(server_obj)
            nic_names = map(lambda x:x,(item.name for item in nic_objs))

            update_list = agorithm.get_intersection(set(client_nic_dict.keys()),set(nic_names))
            add_list = agorithm.get_exclude(client_nic_dict.keys(),update_list)
            del_list = agorithm.get_exclude(nic_names,update_list)

            HandleNic._add_nic(add_list, client_nic_dict, server_obj,user_obj)
            HandleNic._update_nic(update_list, nic_objs, client_nic_dict, server_obj, user_obj)
            HandleNic._del_nic(del_list, nic_objs, server_obj, user_obj)

            response.status = True
        except Exception,e:
            response.message = e.message
            #write error log
            print e.message
        return response
  • 创建dal包,用于存放数据操作程序,具体与数据库交互的程序。如用户认证:
from web_models import models

def get_count(**kwargs):
    count = models.AdminInfo.objects.filter(**kwargs).count()
    return count

def get_single(**kwargs):
    obj = models.AdminInfo.objects.get(**kwargs)
    return obj

1.3后台管理应用

思路通上API应用程序,不同之处是应需要添加与前端交互的forms模块等;

1.4前端程序

templates中创建应用目录,区分存放应用前台文件;

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

2、中控机

2.1中控机程序

中控机为Python程序可基于saltstack/ansible等程序进行对服务器的批量数据采集。

  • 接受来自API的主机信息
  • 插件编写,plugins模块进行对服务器数据采集,如:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#内存数据采集

import os
import subprocess
import commands
import BasePlugin
from lib.commons import convert
from lib.commons import log

class MemoryPlugin(BasePlugin.BasePlugin):

    def linux(self):
        result = {‘status‘:0,‘data‘:{}}
        try:
            #shell_command = "/usr/bin/sudo dmidecode -q -t 17 2>/dev/null"
            shell_command = "sudo dmidecode  -q -t 17 2>/dev/null"

            output = self.exec_shell_cmd(shell_command)
            result[‘data‘] = self.parse(output)
            result[‘status‘] = 1
        except Exception,e:
            print e
            result[‘error‘] = e
        return result

    def parse(self,content):
        ‘‘‘
        解析shell命令返回结果
        :param content: shell 命令结果
        :return:解析后的结果
        ‘‘‘
        ram_dict = {}
        key_map = {
            ‘Size‘:‘capacity‘,
            ‘Locator‘:‘slot‘,
            ‘Type‘:‘model‘,
            ‘Speed‘:‘speed‘,
            ‘Manufacturer‘:‘manufactory‘,
            ‘Serial Number‘:‘sn‘,

        }
        devices = content.split(‘Memory Device‘)
        for item in devices:
            item = item.strip()
            if not item:
                continue
            if item.startswith(‘#‘):
                continue
            segment = {}
            lines = item.split(‘\n\t‘)
            for line in lines:
                if len(line.split(‘:‘))>1:
                    key,value = line.split(‘:‘)
                else:
                    key = line.split(‘:‘)[0]
                    value = ""
                if key_map.has_key(key):
                    if key == ‘Size‘:
                        segment[key_map[‘Size‘]] = convert.convert_mb_to_gb(value,0)
                    else:
                        segment[key_map[key.strip()]] = value.strip()
            ram_dict[segment[‘slot‘]] = segment

        return ram_dict

3、服务器

打通与中控机的交互

  • 将公钥保存至服务器A、服务器B...
  • 服务器上安装
    -- dmidecode  用于采集内存信息
    -- MegaCli       用于采集硬盘信息

其他:

如需生成后台验证码安装Pillow,及相关应用包

http://www.reader8.cn/jiaocheng/20120906/2009724.html

时间: 2024-12-08 18:48:46

django02_01 CMDB (附源码)的相关文章

一组网页边栏过渡动画,创意无限!【附源码下载】

今天我们想与大家分享另一套过渡效果.这一次,我们将探讨如何实现侧边栏的过渡动画,就像我们已经在多级推出菜单中使用的.我们的想法是,以细微的 过渡动画显示一些隐藏的侧边栏,其余的内容也是.通常侧边栏滑入,把其他内容推到一边.这个可过程中可以加入很多微妙而奇特的效果,而今天这篇文章能够给 你一些启示. 温馨提示:为保证最佳的效果,请在 IE10+.Chrome.Firefox 和 Safari 等现代浏览器中浏览. 立即下载      在线演示 因为我们希望能够在一个页面上展现所有的效果,因此我们示

创意无限!一组网页边栏过渡动画【附源码下载】

今天我们想与大家分享另一套过渡效果.这一次,我们将探讨如何实现侧边栏的过渡动画,就像我们已经在多级推出菜单中使用的.我们的想法是,以细微的过渡动画显示一些隐藏的侧边栏,其余的内容也是.通常侧边栏滑入,把其他内容推到一边.这个可过程中可以加入很多微妙而奇特的效果,而今天这篇文章能够给你一些启示. 温馨提示:为保证最佳的效果,请在 IE10+.Chrome.Firefox 和 Safari 等现代浏览器中浏览. 立即下载      在线演示 因为我们希望能够在一个页面上展现所有的效果,因此我们示例的

C#版无人驾驶汽车(附源码)

一,简单问题复杂化: 100公里/1小时的速度,在日常生活中是比较常见的速度,把它转换为其它单位: 100公里/1小时 ≈ 28米/1秒 100公里/1小时 ≈ 2800厘米/秒 如果想要无人驾驶汽车达到厘米级的位移监测.探测器扫描路况时,每秒上传2800次数据给PC机.若一辆汽车有10个探测器,就意味着每秒的并发量为2.8W次/秒. 2.8W次/秒的并发量,在网站上肯定会采用分布式,缓存,读写分离,集群技术,关键还有这个数据的存储,到底用二维数据库,还是用NOSQL.这些问题是不是让你很头痛?

wpf 模拟3D效果(和手机浏览图片效果相似)(附源码)

原文 wpf 模拟3D效果(和手机浏览图片效果相似)(附源码) pf的3D是一个很有意思的东西,类似于ps的效果,类似于电影动画的效果,因为动画的效果,(对于3D基础的摄像机,光源,之类不介绍,对于依赖属性也不介绍.),个人认为,依赖属性这个东西,有百分之五十是为了3D而存在.(自己写的类似于demo的东西)先上图,无图无真相这是demo的整个效果图,可以用鼠标移动,触摸屏也可以手指滑动,图片会移动,然后移动结束,会有一个回弹的判断. <Window x:Class="_3Dshow.Wi

10个Web前端值得收藏的背景全屏效果展示(附源码)(上)

作为一个前沿的 Web 开发者,对于 HTML5 和 现在流行的3D技术或多或少都有掌握.特别是在移动端大显身手.这篇文章挑选了10个绚丽的背景全景展示效果,希望对你有所帮助. 1.  JS图片背景全屏代码实现物理效果 玩法介绍:可以随意拖动鼠标.按住鼠标左键选中旋转物体.或者按住鼠标滑轮放大或者缩小,有不同的效果,赶紧来体验一下. 源码下载  /  在线演示 2.  CSS3学习 - 网站背景拉伸平铺jQuery插件 这个插件集成了一些非常好的 JavaScript 库,提供一个方便使用的文本

【网站国际化必备】Asp.Net MVC 集成Paypal(贝宝)快速结账 支付接口 ,附源码demo

开篇先给大家讲段历史故事,博主是湖北襄阳人.襄阳物华天宝,人杰地灵,曾用名襄樊.在2800多年的历史文化中出现了一代名相诸葛亮(卧龙),三国名士庞统(凤雏),魏晋隐士司马徽(水镜先生),唐代大诗人孟浩然(孟襄阳),张继.杜审言,文学家皮日休,北宋著名书画家米芾(米襄阳),“允冠百王”的光武帝刘秀,东方圣人释道安等一大批历史文化名人.小说<三国演义>120回故事中有30多回提到襄阳. 相传诸葛亮的老婆黄月英黄头发黑皮肤,但知识广博.诸葛亮发明木牛流马,就是从黄月英的传授的技巧上发展出来.不仅如此

利用Java针对MySql封装的jdbc框架类 JdbcUtils 完整实现(包含增删改查、JavaBean反射原理,附源码)

最近看老罗的视频,跟着完成了利用Java操作MySql数据库的一个框架类JdbcUtils.java,完成对数据库的增删改查.其中查询这块,包括普通的查询和利用反射完成的查询,主要包括以下几个函数接口: 1.public Connection getConnection()   获得数据库的连接 2.public boolean updateByPreparedStatement(String sql, List<Object>params)throws SQLException  更新数据库

Android学习笔记(十四)——在运行时添加碎片(附源码)

在运行时添加碎片 点击获取源码 将UI分割为多个可配置的部分是碎片的优势之一,但其真正强大之处在于可在运行时动态地把它们添加到活动中. 1.使用上一篇创建的Fragments项目,在main.xml文件中注释掉两个<fragment>元素: 2.在FragmentActivity.java中添加下面的代码: FragmentManager fragmentManager = getSupportFragmentManager();//向活动添加碎片 FragmentTransaction fr

Android学习笔记(十五)——碎片的生命周期(附源码)

碎片的生命周期 点击下载源码 与活动类似,碎片具有自己的生命周期.理解了碎片的生命周期后,我们可以在碎片被销毁时正确地保存其实例,在碎片被重建时将其还原到前一个状态. 1.使用上一篇的项目Fragments,在Fragment1.java文件中添加如下代码: package net.zenail.Fragments; import android.app.Activity; import android.os.Bundle; import android.support.v4.app.Fragm

android Listview分批加载+自动加载(附源码下载)

直接上代码,代码有注释: public class TestForListviewActivity extends Activity implements OnScrollListener { private ListView mListview = null; private View mFooterView; private PaginationAdapter mAdapter; private Handler handler=new Handler(); private boolean i