CMDB学习之一
CMDB - 配置管理数据库 资产管理
自动化相关的平台(基础 CMDB):
1. 发布系统
2. 监控
3. 配管系统、装机
4. 堡垒机
CMDB的目的:
1. 替代EXCEL资产管理 —— 资产不准确
2. 与监控系统联动
3. 自动装机
期望:资产管理
实现原理:
1. agent 机器多的时候
2. ssh
3. salt
实现兼容三种模式,可扩展性
基础的架构:
1. 资产采集的代码
2. API
3. 管理平台
################
今天的目标:
资产采集:
- 资产采集代码
python的脚本
- api
Django
创建项目:
资产采集
auto_clent:
agent模式:
1. 采集资产信息
2. 使用requests模块发POST请求提交的资产信息,交给api,持久化
ssh模式:
1. 获取未采集的主机列表
2. 远程连接(ssh)上指定的主机,执行命名采集资产信息
3. 使用requests模块发POST请求提交的资产信息
salt模式:
1. 获取未采集的主机列表
2. 远程连接(salt)上指定的主机,执行命名采集资产信息
3. 使用requests模块发POST请求提交的资产信息
知识点:
1. csrf_exempt 某个视图不需要检验CSRF
2. requests模块 data={} url编码 Django中取 request.POST
data = json字符串 request.POST没有值 ——》 request.body
3. 处理错误信息:
不要用e traceback.format_exc() 错误堆栈
4. 唯一标识:
物理机 s/n号
物理机 + 虚拟机:
主机名 + 文件
规则:
1. 新的机器 以主机名的一个空的文件 采集信息存到文件中 当前是新增
2. 老的机器 改主机名 文件内容更新 当前变更 文件名也更新
5. 返回值:
r1.content, byte
r1.text, 字符串
r1.json(), 反序列化的结果
6. 线程池:
from concurrent.futures import ThreadPoolExecutor
pool = ThreadPoolExecutor(10)
for host in host_list:
pool.submit(task,host)
7. 遵循的原则:
开放封闭原则:
开放: 配置
封闭: 源码
###############################################
首先模块设计,资产采集方式 第一个种是Agent的方式采集

第二种采集方式采用中间控件机制,中控件机,首先要获取未采集数据信息的列表,然后去服务器去采集

资产采集客户端目录规划开始 创建一个项目目录这个,这个是采集目录,是直接运行在服务器程序,
auto_client的目录规划
bin执行文件,
config配置文件,
lib公共库,
src程序逻辑,
log日志

执行入口bin 开始
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()
逻辑文件

src
engine (创建采集目录)
agent.py
class AgnetHandler(object):
def handler(self):
"""
Agent模式下处理资产采集
:return:
"""
print('agent模式')
salt.py
class SaltHandler(object):
def handler(self):
"""
Salt模式下处理资产采集
:return:
"""
print(‘salt模式’)
ssh.py
class SSHHandler(object):
def handler(self):
"""
SSH模式下处理资产采集
:return:
"""
print('SSH模式')
script.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("不支持这个模式采集")
#这种是简单工厂模式
做可插拔的程序,写在配置文件,选项使用那一种方式去采集数据
config
settings.py
ENGINE='agent' #支持agent,salt,SSH数据采集
#########################上面的比较low 下面用反射实现
#利用反射的方式,执行采集方法,首先在配置文件写一个字典
#利用反射执行采集,开发封闭原则
ENGINE_HANDLERS = {
'agent':'src.engine.AgnetHandler',
'salt':'src.engine.SaltHandler',
'ssh':'src.engine.SSHHandler',
}
script.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()
所有采集数据方法,都进行约束

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
CMDB学习之一的更多相关文章
- CMDB学习之七-实现采集错误捕捉,日志信息处理
首先采集disk的具体实现方上代码: # !/usr/bin/env python # -*- coding:utf-8 -*- from .base import BasePlugin import ...
- CMDB学习之四 ——DEBUG模式
定义一个debug,进行解析调试,到测试文件 配置文件,配置debug模式,定义环境变量, #!/usr/bin/env python # -*- coding:utf-8 -*- import os ...
- CMDB学习之二数据采集
首先也要调用插件的方式,来写采集数据插件,在src目录下创建一个插件 plugins ,然后在plugins下创建disk.py ,memory.py, network.py等等 src plugin ...
- CMDB学习之六 --客户端请求测试,服务端api优化
客户端使用agent 请求测试,agent使用的POST 请求,使用requests模块 本地采集,汇报服务端 #!/usr/bin/env python # -*- coding:utf-8 -*- ...
- CMDB学习之八,完成所有资产采集信息的收集
#!/usr/bin/env python # -*- coding:utf-8 -*- import traceback from .base import BasePlugin from lib. ...
- CMDB学习之五服务端api
服务端api 对发送来的数据进行处理,并返回结果,首先要创建一个Django项目 第一步,就是写URL路由在分支中写url api 主路由 from django.conf.urls import u ...
- CMDB学习之三数据采集
判断系统因为是公用的方法,所有要写基类方法使用,首先在插件中创建一个基类 将插件文件继承基类 思路是创建基类使用handler.cmd ,命令去获取系统信息,然后进行判断,然后去执行 磁盘 ,cpu, ...
- Python 学习 第十篇 CMDB用户权限管理
Python 学习 第十篇 CMDB用户权限管理 2016-10-10 16:29:17 标签: python 版权声明:原创作品,谢绝转载!否则将追究法律责任. 不管是什么系统,用户权限都是至关重要 ...
- Python学习路程CMDB
本节内容 浅谈ITIL CMDB介绍 Django自定义用户认证 Restful 规范 资产管理功能开发 浅谈ITIL TIL即IT基础架构库(Information Technology Infra ...
随机推荐
- CF209C Trails and Glades(欧拉路)
题意 最少添加多少条边,使无向图有欧拉回路. n,m≤106 题解 求出每个点的度数 奇度数点需要连一条新边 仅有偶度数点的连通块需要连两条新边 答案为上面统计的新边数 / 2 注意:此题默认以1为起 ...
- Mysql学习总结(1)——常用sql语句汇总
一.基础 1.说明:创建数据库 CREATE DATABASE database-name 2.说明:删除数据库 drop database dbname 3.说明:备份sql server --- ...
- 【转】黄聪:HtmlAgilityPack教程案例
[转]黄聪:HtmlAgilityPack教程案例 HtmlAgilityPack中的HtmlNode类与XmlNode类差不多,提供的功能也大同小异.下面来看看该类提供功能. 一.静态属性 publ ...
- [转] C# HttpWebRequest 绝技
c# HttpWebRequest与HttpWebResponse绝技 阅读原文 如果你想做一些,抓取,或者是自动获取的功能,那么就跟我一起来学习一下Http请求吧.本文章会对Http请求时的G ...
- 洛谷——P3374 【模板】树状数组 1
https://www.luogu.org/problem/show?pid=3374 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某一个数加上x 2.求出某区间每一个数的和 输入输 ...
- C#+ArcGIS Engine 获取地图中选中的要素
转自 C#+ArcGIS Engine 获取地图中选中的要素 C#+ArcGIS Engine 获取地图中选中的要素 提供一种简单遍历获取地图中选中要素的方法,代码如下: List<IFeatu ...
- Intent传递对象——Serializable和Parcelable差别
前两篇文章讨论了Serializable和Parcelable实现Intent之间传递对象和对象数组的方式.两种方法实现上相似,效果一致,怎么选择用哪种方法实现呢? Intent在不同的组件中传递对象 ...
- Codeforces Round #337 (Div. 2) 610C Harmony Analysis(脑洞)
C. Harmony Analysis time limit per test 3 seconds memory limit per test 256 megabytes input standard ...
- Visual Code的调试
Run 'Debug: Download .NET Core Debugger' in the Command Palette or open a .NET project directory to ...
- Docker -- 系统整洁之道 -- 0
在我的小 rmbp 256G的硬盘里,实在是装不下100多个G的虚拟机了,所以想把一些东西迁移到这两年很火的Docker下,Docker以前也有过一两次,只是按着别人给的用法用的,具体的一些细节并没有 ...