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))
三,后台系统,主要涉及的是增删改查,暂不做分析,待续。。。
四,最重要的是表结构,暂时不放源码,待续。。。
用户类型表
用户信息表
用户登陆账号表
设备类型表
用户组表
机房表
合同表
转载于:https://blog.51cto.com/yunweipy/1693906