自动化运维平台愿景和服务器管理系统背景
服务器管理系统
管理后台示例
需求和设计
为什么开发服务器管理系统?
背景:
- 原来是用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
)
客户端截图