自动化运维平台愿景和服务器管理系统背景

 

服务器管理系统

管理后台示例

 

需求和设计

为什么开发服务器管理系统?

背景:

  1. 原来是用Excel维护服务器资产,samb服务【多个运维人员手动维护】
  2. 搭建运维自动化平台【服务器管理】
  3. 预算
  4. 部门合作数据交换,处理麻烦

目标:

  1. 硬件资产自动采集
  2. API

架构设计:

  1. 采集资产【每台服务器上安装的客户端,agent,定时任务每天凌晨2点】
  2.  API【入库和比较创建变更日志】
  3. 后台管理部分

系统目标

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\',
)	

可扩展性,肯本没有,所以我觉得这样不好

  1. 采集资产的组件写成了一个目录
  2. 一般情况程序不写在软件里
  3. 文件就2M但是日志3G, 所以一般不写在这

src 业务逻辑

  1. 调用只写方法
  2. 我这插件有20个,我全都能调用的了吗?
  3. 但是我只用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
)

 客户端截图

版权声明:本文为luoahong原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/luoahong/p/9259305.html