wKioL1Xynz6xYDhJAAGmoq1Gjno601.jpg


CMDB项目,以上是流程图~

PS:

    以实体机为模型开发的,虚拟机的粒度比实体机小得多

    1,需要先通过后台管理系统录入服务器基本信息(如主机名,sn号,机房机柜合同等,硬件信息不需要录入,会自动获取),这是本系统的入口。

    2,没有采用saltstack或puppet,因为公司目前没有用到,直接做了一个中控机,这样就不用在每台服务器上安装agent了。通过中控机采集硬件信息,并提交到相应接口

详解

一,后台管理系统

   1,录入资产,通过后台管理系统录入服务器基本信息。

二,API,中控机通过调用API来获取主机列表,或者提交采集的硬件信息

    1,定义接口

       a,获取主机列表接口:/api/untreated_server/
       b,提交服务器硬件信息接口:/handle_server_info/
   2,配置API验证的key(settings.py文件中)
       a,验证是必须的,涉及到公司所有资产,非常机密
       b,通过key+时间戳+过期时间+使用次数,进行加密

三,中控机(只一台),根据主机列表采集硬件信息并提交到API

    配置接口
        -- 配置文件中设置后台管理IP:127.0.0.1
        -- 配置文件中设置后台管理端口:8000
        -- 配置文件中设置获取主机列表:/api/untreated_server/
        -- 配置文件中设置发送主机信息:/api/handle_server_info/

    配置paramko
        -- 创建一对密钥,将私钥保存至程序根目录(将公钥保存至服务器A、服务器                B...)
        -- 配置文件中设置私钥路径

    配置错误日志文件
        -- 配置文件中设置错误日志文件(默认:程序根目录下error.log)

    配置API验证使用的Key
        -- 配置文件中设置API验证Key


四、服务器 ,需要配置公钥和采集信息的工具(命令)

    1,将公钥保存至服务器A、服务器B...

    2,服务器上安装
        -- dmidecode  用于采集内存信息
        -- MegaCli       用于采集硬盘信息


以上是简要分析系统结构和所需配置,

后面是部分代码分析

一、中控机,本系统的核心组件。采集和提交硬件数据

 以下为中控机入口代码,采集硬件信息代码待续。。。

Program():
    ():
        .host = config.configration[]
        .port = config.configration[]
        .push_resource = config.configration[]
        .fetch_resource = config.configration[]
        .timeout = config.configration[]
        .remote_user = config.configration[]
        .remote_port = config.configration[]
    fetch_hosts():
        ret = None
        :
            response = .url_request(.fetch_resource, , None)
            result = json.loads(response)
            ret = result[]
            result[]:
                Exception(response[])
        Exception, e:
            log.write_error_log(% str(e))
        ret
    execute():
        result = .fetch_hosts()
        result:
            None

        ThreadPool.initialize()
        item result:
            hostname = item[]
            thread_obj = ThreadPool.get_thread()
            thread_obj._Thread__target = .process
            thread_obj._Thread__args = (hostname, thread_obj,)
            thread_obj.start()
    process(, hostname, thread_obj):

        :
            server_response = PluginApi.get_server_info(hostname, .remote_user, .remote_port)
            server_response.status:
                Exception(server_response.message)
            params = urllib.urlencode({: json.dumps(server_response.data)})
            .url_request(.push_resource, , params)
        Exception, e:
            log.write_error_log(% (hostname, str(e)))
        :
            ThreadPool.add_thread(thread_obj)
    url_request(, resource, method, params):
        headers = {: ,
                   : ,
                   : securty.create_api_key()}
        conn = httplib.HTTPConnection(.host, .port, .timeout)
        conn.request(method, resource, params, headers)
        response = conn.getresponse()
        original = response.read()
        original

__name__ == :
    objProgram = Program()
    objProgram.execute()

二,API入口代码,数据库层和业务层待续。。。。

handle_server_info(request):
    ret = {: , : }

    request.method == :
        :
            server_info_str = request.POST.get(, None)
            server_info_dict = json.loads(server_info_str)
            sn = server_info_dict[].strip()
            server_response = api_manager.ServerHelper.get_server_obj(sn)
            server_response.status:
                Exception()
            user_response = api_manager.UserHelper.get_user_obj()
            user_response.status:
                Exception()

            user_obj = user_response.data
            server_obj = server_response.data
            api_manager.HandleBasic.process(server_obj, server_info_dict, user_obj)
            api_manager.HandleNic.process(server_obj, server_info_dict[], user_obj)
            api_manager.HandleMemory.process(server_obj, server_info_dict[], user_obj)
            api_manager.HandleDisk.process(server_obj, server_info_dict[], user_obj)

            api_manager.HandleBasic.update_time(server_obj, user_obj)

            ret[] = Exception,e:
            ret[] = str(e)
    HttpResponse(json.dumps(ret))


untreated_server(request):
    ret = {: , : , : }
    :
        result = api_manager.get_untreated_servers()
        result.status:
            ret[] = result.data
            ret[] = :
            Exception(result.message)
    Exception, e:
        ret[] = str(e)
    HttpResponse(json.dumps(ret))

三,后台系统,主要涉及的是增删改查,暂不做分析,待续。。。


四,最重要的是表结构,暂时不放源码,待续。。。

 用户类型表

 用户信息表

 用户登陆账号表

 设备类型表

 用户组表

 机房表

 合同表