CMDB服务器管理系统【s5day87】:需求讨论-设计思路
自动化运维平台愿景和服务器管理系统背景
服务器管理系统
管理后台示例
需求和设计
为什么开发服务器管理系统?
背景:
- 原来是用Excel维护服务器资产,samb服务【多个运维人员手动维护】
- 搭建运维自动化平台【服务器管理】
- 预算
- 部门合作数据交换,处理麻烦
目标:
- 硬件资产自动采集
- API
架构设计:
- 采集资产【每台服务器上安装的客户端,agent,定时任务每天凌晨2点】
- API【入库和比较创建变更日志】
- 后台管理部分
系统目标
1. 自动采集服务器硬件资产信息
2. 报表
3. API(给其他系统提供数据)
设计思路
1.专门采集资产信息软件,执行命令,筛选过滤。192.168.16.54
用户名:
密码:
pymysql\ insert into network values(192.168.16.54)
考虑到安全原因要定期更改、被黑客拿到,所以一般不这样做
流程:
– 执行shell名称,获取结果,解析
– Python代码发送POST请求,数据
http://127.0.0.1:8000/index
客户端代码结构如下图:
– Django
2. API:
http://127.0.0.1:8000
url -> 视图函数
def func(request):
request.POST
保存到数据库
3. 后台管理:
提供数据管理
服务器端代码结构图如下
基本框架搭建
采集资产信息
客户端代码auto_client\run.py
import subprocess import requests result = subprocess.getoutput(\'ipconfig\') message = result[760:775] api = "http://127.0.0.1:8000/api/server.html" requests.post(url=api,data={\'k1\':message}) #因为公司会采集很多资产,今天需要这样的信息,明天可能需要其他的信息,所以我们要开发成可插拔式的
客户端截图
服务器端auto_server\api\urls.py
from django.conf.urls import include, url from django.contrib import admin from .import views urlpatterns = [ url(r\'^server.html$\', views.server), ] auto_server\api\views.py from django.shortcuts import render,HttpResponse from django.views.decorators.csrf import csrf_exempt # Create your views here. @csrf_exempt #表示不用再加csrf系统用户验证了 def server(request): print(request.POST) return HttpResponse(\'已收到\')
服务器端auto_server\api\urls.py
from django.shortcuts import render,HttpResponse from django.views.decorators.csrf import csrf_exempt # Create your views here. @csrf_exempt #表示不用再加csrf系统用户验证了 def server(request): print(request.POST) return HttpResponse(\'已收到\')
服务器端auto_server\api\views.py
from django.conf.urls import include, url,include from django.contrib import admin urlpatterns = [ url(r\'^admin/\', include(admin.site.urls)), url(r\'^api/\', include(\'api.urls\')), ]
服务器端截图
API实现
浏览器API测试
客户端代码
多个资产如何处理
import subprocess import requests #10个资产 server_dict = {} result = subprocess.getoutput(\'ipconfig\') message = result[760:775] server_dict[\'network\'] = message result = subprocess.getoutput(\'ipconfig\') message = result[760:775] server_dict[\'network\'] = message api = "http://127.0.0.1:8000/api/server.html" print(message) requests.post(url=api,data={\'k1\':message}) #因为公司会采集很多资产,今天需要这样的信息,明天可能需要其他的信息,所以我们要开发成可插拔式的
资产采集之定制采集插件
客户端代码auto_client\run.py
import sys import os BASEDIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) #当前文件路径上一层bin,再上一层就到auto_client,加到环境变量里面来了 sys.path.append(BASEDIR) from conf import settings for k,v in settings.PLUGIN_TIMES(): print(k,v,type) #找到字符串:src.plugins.nic.Nic,src.plugins.desk.Disk #找到对应的模块,找到对应的类,勒种执行process方法 # from src.plugins.disk import Disk # obj = Disk() # obj.process() import importlib m = importlib.import_module("src.plugins.nic.Nic") cls = getattr(m, \'Nic\') obj = cls() obj.process() v = "src.plugins.nic.Nic" module_path,cls_name = v.rsplit(\'.\',maxsplit=1) #我从右边找到第一个点分割一下 m = importlib.import_module(module_path) cls = getattr(m,cls_name) obj = cls() obj.process()
参照Django配置文件部分代码:
INSTALLED_APPS = ( \'django.contrib.admin\', \'django.contrib.auth\', \'django.contrib.contenttypes\', \'django.contrib.sessions\', \'django.contrib.messages\', \'django.contrib.staticfiles\', )
可扩展性,肯本没有,所以我觉得这样不好
- 采集资产的组件写成了一个目录
- 一般情况程序不写在软件里
- 文件就2M但是日志3G, 所以一般不写在这
src 业务逻辑
- 调用只写方法
- 我这插件有20个,我全都能调用的了吗?
- 但是我只用3个。可扩展加上一个 配置文件
基于以上原因解决方案如下:
auto_client\src\plugins\disk.py
class Disk(object): def process(self): return \'disk info\'
auto_client\src\plugins\nic.py
class Nic(object): def process(self): return \'nic info\'
auto_client\src\plugins\memory.py
class Memory(object): def process(self): return \'memory info\'
auto_client\bin\run.py
import sys import os import importlib import requests BASEDIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.append(BASEDIR) from conf import settings server_info = {} for k,v in settings.PLUGIN_ITEMS.items(): # 找到v字符串:src.plugins.nic.Nic,src.plugins.disk.Disk module_path,cls_name = v.rsplit(\'.\',maxsplit=1) module = importlib.import_module(module_path) cls = getattr(module, cls_name) obj = cls() ret = obj.process() server_info[k] = ret requests.post( url=settings.API, data=server_info )
客户端截图