首先也要调用插件的方式,来写采集数据插件,在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. file_get_contents 无法采集 https 网站

    <?php echo file_get_contents("https://www.baidu.com"); ?> 运行以上代码会报以下错误: 再运行一次去看看!

  2. Git 服务器更换了IP的解决方法

    1.找到项目根目录中的.git文件夹 2..git文件夹里有一个config文件 3.用记事本打开后,修改为服务器的新ip就行了.

  3. Android异步载入全解析之开篇瞎扯淡

    Android异步载入 概述 Android异步载入在Android中使用的很广泛,除了是由于避免在主线程中做网络操作.更是为了避免在显示时由于时间太长而造成ANR,添加显示的流畅性,特别是像List ...

  4. HTML5学习笔记简明版(11):新增的API

    HTMLDocument上的扩展 HTML5在DOM Level 2 HTML上扩展了一些HTMLDocument的接口.这些接口在全部实现了Document接口的元素对象上进行了实现. HTML5在 ...

  5. docker 笔记1

    如果想要删除所有container的话再加一个指令: docker stop $(docker ps -a -q) 如果想要删除所有container的话再加一个指令: docker rm $(doc ...

  6. vue 实现文本域还剩多少字符

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. 分享一个vue中的vue-Resource用法

    //引入 <script src="//cdn.bootcss.com/vue-resource/1.2.1/vue-resource.js" type="text ...

  8. excel操作小技巧

    excel拼接sql语句时,时间格式问题 问题:若直接插入时间的单元格 :="insert into t_entity_car (create_time,name,age) value (' ...

  9. 在Windows上如何安装和彻底卸载Adobe Flash Player教程

    很多小伙伴在安装水晶易表的时候,经常会遇到“Xcelsius2008需要使用Adobe Flash Player(9.151或者更高版本)”报错问题,如下图所示. 导致安装进程受阻,此时就需要安装高版 ...

  10. 昼猫笔记--什么是DOM

    昼猫笔记--给你带来不一样的笔记 不止是笔记 更多的是思考 Hello,大家好,昼猫,今天来加深下DOM 什么DOM呢?它的全称叫 Document Object Model 通过全称可以知道它是 文 ...