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

服务器管理系统

管理后台示例

需求和设计

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

背景:

  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
)

 客户端截图

CMDB服务器管理系统【s5day87】:需求讨论-设计思路的更多相关文章

  1. CMDB服务器管理系统【s5day89】:部分数据表结构-资产入库思路

    1.用django的app作为统一调用库的好处 1.创建repository app截图如下: 2.好处如下: 1.app的本质就是一个文件夹 2.以后所有的app调用数据就只去repository调 ...

  2. CMDB服务器管理系统【s5day89】:深入理解Java的接口和抽象类

    对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的时候会以为它们可以随意互换使用, ...

  3. CMDB服务器管理系统【s5day88】:采集资产之Agent、SSH和Salt模式讲解

    在对获取资产信息时,简述有四种方案. 1.Agent  (基于shell命令实现) 原理图 Agent方式,可以将服务器上面的Agent程序作定时任务,定时将资产信息提交到指定API录入数据库 优点: ...

  4. CMDB服务器管理系统【s5day90】:API验证

    1.认证思路刨析过程 1.请求头去哪里拿? 1.服务器端代码: def test(request): print(request) return HttpResponse('你得到我了') 2.客户端 ...

  5. CMDB服务器管理系统【s5day88】:采集资产-文件配置(一)

    django中间件工作原理 整体流程: 在接受一个Http请求之前的准备 启动一个支持WSGI网关协议的服务器监听端口等待外界的Http请求,比如Django自带的开发者服务器或者uWSGI服务器. ...

  6. CMDB服务器管理系统【s5day90】:API构造可插拔式插件逻辑

    1.服务器端目录结构: 1.__init__.py from django.conf import settings from repository import models import impo ...

  7. CMDB服务器管理系统【s5day90】:获取今日未采集主机列表

    1.目录结构 1.服务器端 2.客户端 2.具体代码如下 1.数据库增加两个字段 class Server(models.Model): """ 服务器信息 " ...

  8. CMDB服务器管理系统【s5day90】:创建资产更新服务器硬盘信息

    1.创建硬件资产信息 import json from django.shortcuts import render,HttpResponse from django.views.decorators ...

  9. CMDB服务器管理系统【s5day91】:资产采集相关问题

    资产采集唯一标识和允许临时修改主机名 class AgentClient(BaseClient): def exec(self): obj = PluginManager() server_dict ...

随机推荐

  1. SQLServer之FOREIGN KEY约束

    FOREIGN KEY约束添加规则 1.外键约束并不仅仅可以与另一表的主键约束相链接,它还可以定义为引用另一个表中 UNIQUE 约束的列. 2.如果在 FOREIGN KEY 约束的列中输入非 NU ...

  2. 聚类——GMM

    聚类——认识GMM算法 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 一.GMM概述 二.GMM算法步骤 三.具体推导参考文献 1. 李航. 统计学习 ...

  3. JavaScript Uncaught TypeError: Cannot read property 'value' of null

    用 JavaScript 操作 DOM 时出现如下错误: Uncaught TypeError: Cannot set property 'value' of null Uncaught TypeEr ...

  4. lsof -i

    https://www.cnblogs.com/sparkbj/p/7161669.html 主要命令

  5. 等待通知--wait notify

    1.简单理解 在jdk1.5之前用于实现简单的等待通知机制,是线程之间通信的一种最原始的方式.考虑这样一种等待通知的场景:A B线程通过一个共享的非volatile的变量flag来实现通信,每当A线程 ...

  6. php 表单提交大量数据发生丢失的解决方法

    最近在项目中,出现一个奇怪的现象,有一个大form里面有上千个input,提交的时候,老是发现post过来的数据不完整,一开始还怀疑是html 表单名称有冲突,排除掉了.然后,网上找了一堆,php.i ...

  7. 好程序员技术教程分享JavaScript运动框架

    好程序员技术教程分享JavaScript运动框架,有需要的朋友可以参考下. JavaScript的运动,即让某元素的某些属性由一个值变到另一个值的过程.如让div的width属性由200px变到400 ...

  8. Qt License 解读

    对于桌面和移动平台应用 官方说明如下 Qt for Application Development lets you create applications for desktop and mobil ...

  9. 装饰器模式以及Laravel框架下的中间件应用

    Laravel框架的中间件使用:从请求进来到响应返回,经过中间件的层层包装,这种场景很适合用到一种设计模式---装饰器模式. 装饰器模式的作用,多种外界因素改变对象的行为.使用继承的方式改变行为不太被 ...

  10. UOJ188 Sanrd Min_25筛

    传送门 省选之前做数论题会不会有Debuff啊 这道题显然是要求\(1\)到\(x\)中所有数第二大质因子的大小之和,如果不存在第二大质因子就是\(0\) 线性筛似乎可以做,但是\(10^{11}\) ...