CMDB发布系统2.监控3.配管系统、装机4.堡垒机CMDB目的
优采云 发布时间: 2021-08-18 07:02CMDB发布系统2.监控3.配管系统、装机4.堡垒机CMDB目的
CMDB-配置管理数据库资产管理
自动化相关平台(基本CMDB):
1.发布系统
2.监控
3. 管道系统,安装
4.堡垒机
CMDB 的目的:
1.替换EXCEL资产管理-不准资产
2.与监控系统联动
3.自动安装
预期:资产管理
实现原理:
1.代理多机器时
2.ssh
3.盐
实现三种模式兼容,可扩展性
基本结构:
1. Asset采集 的代码
2. API
3.管理平台
################
今天的目标:
资产采集:
- Asset采集code
Python 脚本
- api
姜戈
创建项目:
资产采集
auto_client:
代理模式:
1.采集资产信息
2.使用requests模块发送POST请求,将提交的资产信息提交给api持久化
ssh 模式:
1. 获取不是采集 的主机列表
2.远程连接(ssh)指定主机,执行命名采集asset信息
3. 使用requests模块发送POST请求提交资产信息
盐模式:
1. 获取不是采集 的主机列表
2.远程连接(salt)指定主机,执行命名采集asset信息
3. 使用requests模块发送POST请求提交资产信息
知识点:
1. csrf_exempt 一个视图不需要检查CSRF
2. requests module data={} Django 中的 url 编码 request.POST
data = json 字符串 request.POST 没有值——” request.body
3. 处理错误信息:
不要使用 e traceback.format_exc() 错误堆栈
4.唯一ID:
物理机序列号
物理机+虚拟机:
主机名+文件
规则:
1. 新机 使用主机名采集 的空文件将信息保存到当前新的文件中
2. 旧机改主机名,更新文件内容。当前更改和文件名也会更新。
5.返回值:
r1.content, 字节
r1.text,string
r1.json(),反序列化的结果
6.线程池:
从 concurrent.futures 导入 ThreadPoolExecutor
pool = ThreadPoolExecutor(10)
对于host_list中的主机:
pool.submit(task,host)
7. 遵循的原则:
开闭原则:
打开:配置
关闭:源代码
#########################################
一、模块设计,资产采集方法第一种方法是Agent采集
第二种采集 方法使用中间控制机制。在控制机中,先获取没有采集的数据信息列表,然后到服务器去采集
Asset采集Client 目录规划开始。创建项目目录。这是采集目录,直接运行在服务端程序上。
auto_client 的目录规划
bin 执行文件,
config 配置文件,
lib 公共图书馆,
src 程序逻辑,
日志记录
执行入口bin start
bin
clinet.py
import os, sys
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from src.script import run
if __name__ == '__main__':
run()
逻辑文件
源代码
引擎(创建采集目录)
代理.py
类 AgnetHandler(object):
def handler(self):
"""
Agent模式下处理资产采集
:return:
"""
print('agent模式')
盐.py
class SaltHandler(object):
def handler(self):
"""
Salt模式下处理资产采集
:return:
"""
print(‘salt模式’)
ssh.py
class SSHHandler(object):
def handler(self):
"""
SSH模式下处理资产采集
:return:
"""
print('SSH模式')
脚本.py
from config import setting
from src.engine import agent,salt,ssh
def run():
"""
资产采集入口
:return:
"""
if setting.ENGINE == 'agent':
obj =agent.AgnetHandler()
obj.handler()
elif setting.ENGINE == 'salt':
obj = salt.SaltHandler()
obj.handler()
elif setting.ENGINE == 'ssh':
obj=ssh.SSHHandler()
obj.handler()
else:
print("不支持这个模式采集")
#这种是简单工厂模式
做一个可插拔的程序,写在配置文件中,选择使用采集数据的方式
配置
settings.py
ENGINE='agent' #支持agent,salt,SSH数据采集
########################上面比较低,下面通过反射实现
#利用反射的方式,执行采集方法,首先在配置文件写一个字典
#利用反射执行采集,开发封闭原则
ENGINE_HANDLERS = {
'agent':'src.engine.AgnetHandler',
'salt':'src.engine.SaltHandler',
'ssh':'src.engine.SSHHandler',
}
脚本.py
from config import setting
# from src.engine import agent,salt,ssh
import importlib
def run():
"""
资产采集入口
:return:
"""
# if setting.ENGINE == 'agent':
# obj =agent.AgnetHandler()
# obj.handler()
# elif setting.ENGINE == 'salt':
# obj = salt.SaltHandler()
# obj.handler()
# elif setting.ENGINE == 'ssh':
# obj=ssh.SSHHandler()
# obj.handler()
# else:
# print("不支持这个模式采集")
#利用反射的方式,执行采集方法,首先在配置文件写一个字典
engine_path = setting.ENGINE_HANDLERS.get(setting.ENGINE) #拿到采集模式的脚本的执行路径
#'src.engine.agnet.AgnetHandler' 使用rsplit进行右分割,只是分割一次
path,engine_class=engine_path.rsplit('.',maxsplit=1)
#拿到执行模式脚本的类,使用importlib,导入
# print(path,engine_class)
module = importlib.import_module(path)
# print(module,type(module))
obj=getattr(module,engine_class)() #反射并实例化
obj.handler()
然后就可以将反射写成公共插件了
在lib中创建一个文件,module.srting.py
import importlib
def import_sting(path):
module_path,engine_class=path.rsplit('.',maxsplit=1)
module = importlib.import_module(module_path)
return getattr(module,engine_class)
我正在 script.py 中修改
from config import setting
from lib.module_srting import import_sting
def run():
"""
资产采集入口
:return:
"""
#利用反射的方式,执行采集方法,首先在配置文件写一个字典
engine_path = setting.ENGINE_HANDLERS.get(setting.ENGINE) #拿到采集模式的脚本的执行路径
engine_class = import_sting(engine_path)
obj=engine_class() #反射并实例化
obj.handler()
所有采集data 方法都受到约束
class BaseHandler(object):
def handler(self):
'''
约束派生类
:return:
'''
raise NotImplementedError('handler() must Implemented han')
每个方法都必须导入基类才能继承,agent、salt、ssh都必须继承
from .base import BaseHandler
class AgnetHandler(BaseHandler):
def handler(self):
"""
Agent模式下处理资产采集:硬盘、内存、网卡
:return:
"""
print('agent模式')
#调用pulugins.disk /plugins.momory /plugins.nerwork