首先也要调用插件的方式,来写采集数据插件,在src目录下创建一个插件 plugins ,然后在plugins下创建disk.py ,memory.py, network.py等等

  src

    plugins

  

在disk.py

#获取采集,执行采集命令是cmd 是统一的我直接写agent中进行调用
def get_disk(handler,hostname):
return handler.cmd("dir",hostname)

agent代码

from .base import BaseHandler
from src.plugins.disk import get_disk class AgnetHandler(BaseHandler): def cmd(self,command,hostname=None):
import subprocess
return subprocess.getoutput(command) def handler(self):
"""
Agent模式下处理资产采集:硬盘、内存、网卡
:return:
"""
print('agent模式')
#调用pulugins.disk /plugins.momory /plugins.nerwork
disk = get_disk(self)
print(disk)

salt.py

from .base import BaseHandler

class SaltHandler(BaseHandler):

    def cmd(self, command, hostname=None):
"""
调用saltstack远程连接主机并执行命令(saltstack的master)
:param hostname:主机名
:param command: 要执行的命令
:return:
"""
import salt.client #安装salt
local = salt.client.LocalClient()
result = local.cmd(hostname, 'cmd.run', [command])
return result[hostname] def handler(self):
"""
Salt模式下处理资产采集
:return:
"""
print('salt模式')

ssh.py

from .base import BaseHandler
from config import settings class SSHHandler(BaseHandler): def cmd(self, command, hostname=None):
"""
调用paramiko远程连接主机并执行命令,依赖rsa
:param hostname:主机名
:param command: 要执行的命令
:return:
"""
import paramiko private_key = paramiko.RSAKey.from_private_key_file(settings.SSH_PRIVATE_KEY)
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname=hostname, port=settings.SSH_PORT, username=settings.SSH_USER, pkey=private_key)
stdin, stdout, stderr = ssh.exec_command(command)
result = stdout.read()
ssh.close()
return result
def handler(self):
"""
SSH模式下处理资产采集
:return:
"""
print('SSH模式')

配置settings

### #######################SSH模式的配置##########################

SSH_PRIVATE_KEY="私钥路径"
SSH_USER='cmdb' #用户名
SSH_PORT='' #端口

进行cmd 命令的约束

class BaseHandler(object):

    def cmd(self,command,hostname=None):
'''
cmd约束派生类
:return:
'''
raise NotImplementedError('cmd() must Implemented.') def handler(self):
'''
handler约束派生类
:return:
'''
raise NotImplementedError('handler() must Implemented.')

##########################用法升级,插件写法,反射使用 #################

写配置文件,

  

PLUGINS_DICT = {
'disk':'src.plugins.disk.Disk',
'memory':'src.plugins.memory.Memory',
'network':'src.plugins.network.Network',
'cpu':'src.plugins.cpu.CPU',
}

disk.py

class Disk(object):
def process(self):
'''
执行命令拿到结果
:return:
'''
return "硬盘"

memory.py

class Memory(object):
def process(self):
'''
执行命令拿到结果
:return:
'''
return "内存"

network.py

class Network(object):
def process(self):
'''
执行命令拿到结果
:return:
'''
return "网卡"

cpu.py

class CPU(object):
def process(self):
'''
执行命令拿到结果
:return:
'''
return "CPU"

这里调用之前写好的反射lib 中的方法

from config import settings
from lib.module_srting import import_sting def get_server_info():
'''
获取所有的资产信息并返回
:return:
'''
info={}
for name,path in settings.PLUGINS_DICT.items():
cls=import_sting(path)
obj = cls()
info[name] = obj.process() return info

执行 agent写下测试

############################下面采集真实数据测试

使用agent的方式采集进行本地采集

agent.py

from .base import BaseHandler
from ..plugins import get_server_info class AgnetHandler(BaseHandler): def cmd(self,command,hostname=None):
import subprocess
return subprocess.getoutput(command) def handler(self):
"""
Agent模式下处理资产采集:硬盘、内存、网卡
:return:
"""
print('agent模式')
#调用pulugins.disk /plugins.momory /plugins.nerwork
ret = get_server_info(self) #把自己传进去,agent默认没有主机所有不用hostname
print(ret)

plugins-->__init__.py   执行命令的handler

from config import settings
from lib.module_srting import import_sting def get_server_info(handler,hostname=None):
'''
获取所有的资产信息并返回
:return:
'''
info={}
for name,path in settings.PLUGINS_DICT.items():
cls=import_sting(path)
obj = cls()
info[name] = obj.process(handler,hostname) return info

disk.py  ,memory.py ,cpu.py ,network.py   这里都是测试截取10个字符

class Disk(object):
def process(self,handler,hostname):
'''
执行命令拿到结果磁盘
:return:
'''
ret = handler.cmd('wmic diskdrive',hostname)[0:10]
return ret
class CPU(object):
def process(self,handler,hostname):
'''
执行命令拿到结果cpu
:return:
'''
ret = handler.cmd('wmic cpu',hostname)[0:10]
return ret
class Network(object):
def process(self,handler,hostname):
'''
执行命令拿到结果网卡信息
:return:
'''
ret = handler.cmd('ipconfig',hostname)[0:10]
return ret
class Memory(object):
def process(self,handler,hostname):
'''
执行命令拿到结果内存 测试截取10个字符
:return:
'''
ret = handler.cmd('wmic memphysical list brief',hostname)[0:10]
return ret

CMDB学习之二数据采集的更多相关文章

  1. crawler4j 学习(二)

    crawler4j 学习(二) 实现控制器类以制定抓取的种子(seed).中间数据存储的文件夹.并发线程的数目: public class Controller { public static voi ...

  2. 从零开始学习jQuery (二) 万能的选择器

    本系列文章导航 从零开始学习jQuery (二) 万能的选择器 一.摘要 本章讲解jQuery最重要的选择器部分的知识. 有了jQuery的选择器我们几乎可以获取页面上任意的一个或一组对象, 可以明显 ...

  3. Android Animation学习(二) ApiDemos解析:基本Animators使用

    Android Animation学习(二) ApiDemos解析:基本Animatiors使用 Animator类提供了创建动画的基本结构,但是一般使用的是它的子类: ValueAnimator.O ...

  4. AspectJ基础学习之二搭建环境(转载)

    AspectJ基础学习之二搭建环境(转载) 一.下载Aspectj以及AJDT 上一章已经列出了他的官方网站,自己上去download吧.AJDT是一个eclipse插件,开发aspectj必装,他可 ...

  5. WPF的Binding学习笔记(二)

    原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...

  6. AJax 学习笔记二(onreadystatechange的作用)

    AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...

  7. MyBatis学习系列二——增删改查

    目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring 数据库的经典操作:增删改查. 在这一章我们主要说明一下简单的查询和增删改, ...

  8. MyBatis学习 之 二、SQL语句映射文件(2)增删改查、参数、缓存

    目录(?)[-] 二SQL语句映射文件2增删改查参数缓存 select insert updatedelete sql parameters 基本类型参数 Java实体类型参数 Map参数 多参数的实 ...

  9. MyBatis学习 之 二、SQL语句映射文件(1)resultMap

    目录(?)[-] 二SQL语句映射文件1resultMap resultMap idresult constructor association联合 使用select实现联合 使用resultMap实 ...

随机推荐

  1. C#中Dictionary排序方式

    转载自:https://www.cnblogs.com/5696-an/p/5625142.html 自定义类: https://files.cnblogs.com/files/xunhanliu/d ...

  2. [洛谷P2245]星际导航

    题目大意:有一张n点m边的带权无向图,和一些问题,每次询问两个点之间的路径的最大边权最小是多少. 解题思路:同NOIP2013货车运输,只是数据增大,大变成小,小变成大了而已.所以具体思路见货车运输. ...

  3. hostid---打印当前主机的十六进制数字标识

    hostid命令用于打印当前主机的十六进制数字标识.是主机的唯一标识,是被用来限时软件的使用权限,不可改变. hostid命令查找到的值是取hostname对应的ip地址.然后把ip地址转换成hex, ...

  4. vue+element-ui的简洁导入导出功能

    1.前段后台管理系统中数据展示一般都是用表格,表格会涉及到导入和导出;原生js导出excel2.导入是利用element-ui的Upload 上传组件; <el-upload class=&qu ...

  5. 一:1.1 python程序与数据储存【进制转换】

    二进制 :0 1 [逢二进一]0+0=00+1=11+1=1011+1=100 1 1+ 1------ 100 八进制: 0 1 2 3 4 5 6 7 [逢八进一] 1+7=101+2=3 十进制 ...

  6. 紫书 例题 10-29 UVa 1642(最优连续子序列)

    这类求最优连续子序列的题一般是枚举右端点,然后根据题目要求更新左端点, 一般是nlogn,右端点枚举是n,左端点是logn 难点在于如何更新左端点 用一些例子试一下可以发现 每次加进一个新元素的时候 ...

  7. HDU 4939 Stupid Tower Defense 简单DP

    题意: 地图为长为n个单位长度的直线,每通过一个单位长度需要t秒. 有3种塔,红塔可以在当前格子每秒造成x点伤害,绿塔可以在之后格子造成y点伤害,蓝塔可以使通过单位长度的时间增加z秒. 让你安排塔的排 ...

  8. Unity C# 设计模式(三)工厂方法模式

    定义: 定义一个创建对象的接口(父类),由子类决定需要实例化哪一个类. 这样,核心工厂类成为了一个抽象角色,不再负责产品的创建,仅提供具体工厂类所必须实现的接口,这样进一步抽象化的好处是使得工厂方法模 ...

  9. ECNUOJ 2143 端午节快乐

    端午节快乐 Time Limit:1000MS Memory Limit:65536KBTotal Submit:1720 Accepted:868 Description  有一段有趣的传说.公元前 ...

  10. Java面向切面原理与实践

    Java面向切面原理与实践 一. 面向切面编程是什么 首先用一句话概括:面向切面编程(AOP)就是对某些具有相似点的代码进行增强. 相似点可以是同一个包.使用相同的注解.public的方法.以Impl ...