首先也要调用插件的方式,来写采集数据插件,在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. Linux 下易用的光盘镜像管理工具(虚拟光驱软件)转载

    作者: Frazer Kline | 2014-11-23 11:07   评论: 4 收藏: 4 分享: 10 磁盘镜像包括了整个磁盘卷的文件或者是全部的存储设备的数据,比如说硬盘,光盘(DVD,C ...

  2. 最短路径—Dijkstra 算法和Floyd 算法

    某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多.这让行人很困扰. 现在 ...

  3. php八大设计模式之单例模式

    单例模式的好处: 实例化后只得到一个对象,减少内存的开销. 实现单例模式: 提供一个私有的属性用来存储实例后的对象. 禁止外部实例化对象,提供公共的的方法,返回实例化后的对象. 避免继承此类,然后重写 ...

  4. SSL和SSH

    简单的来说:SSL是安全传输的一种安全协议,SSH只是在传输的时候为了防止"中间人"篡改数据而提供的安全的"通道" 在使用的时候我们只关心传输数据的安全性,那么 ...

  5. NodeJS学习笔记 (20)错误处理-error

    文章地址 https://github.com/chyingp/nodejs-learning-guide

  6. 移动端viewport解惑

    我们在做移动端webapp的时候需要设置这么一段: <meta name="viewport" content="width=device-width, initi ...

  7. [笔记-图论]Bellman-Ford

    用于求可带负权的单源有向图 优化后复杂度O(nm) 如果图中存在负环,就不存在最小路 这种情况下,就一定会有一个顶点被松弛多于n-1次,Bellman-Ford可直接判断出来 我在网上看到SPFA,发 ...

  8. 除了 Microsoft Office我们还可以选择哪些软件?

    不同的人有不同爱好,不同的人有着不同的人生追求,软件公司也是如此.尽管 Microsoft Office 比之前要便宜得多了,但其按时间累计的完整的安装版本的价格仍然很高,基于对普通用户亦或手头比较紧 ...

  9. centos同步网络北京时间

    sudo yum -y install ntpdate ntp sudo ntpdate time.windows.com sudo hwclock -w

  10. Python3小白初体验

    三层循环嵌套,以后优化 data = { "北京":{ "a":{ ", " }, "b":{ ", &quo ...