首先也要调用插件的方式,来写采集数据插件,在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. bzoj1618 购买干草

    Description 约翰的干草库存已经告罄,他打算为奶牛们采购日(1≤日≤50000)磅干草.他知道N(1≤N≤100)个干草公司,现在用1到N给它们编号.第i个公司卖的干草包重量为Pi(1≤Pi ...

  2. 四舍五入VS银行家舍入法

    在学习python的时候,遇见了一个颠覆了我传统观念的四舍五入. 看下面,round()的结果和我们以前根深蒂固的四舍五入是不同的. >>> round(0.5) 0 >> ...

  3. 监控mysqld服务

    #!/bin/bash #监控mysqld服务 #telnet 192.168.122.171 3306 | grep Connected | wc -l #远程检查 #num=`netstat -n ...

  4. ArcSDE学习笔记--------增、删、改、查操作

    建立连接 package org.lq.ssm.gp.controller; import com.esri.sde.sdk.client.SeConnection; import com.esri. ...

  5. windows下laravel5安装

    第一步:安装composer    网上教程非常多,自行百度 第二步:使用composer create-project laravel/laravel learnlaravel5 5.0.22   ...

  6. Linux下FTPserver的实现(仿vsftpd)

    继上一篇博文实现Linux下的shell后,我们进一步利用网络编程和系统编程的知识实现Linux下的FTPserver.我们以vsftpd为原型并实现了其大部分的功能.因为篇幅和时间的关系,这里不再一 ...

  7. Codeforces 558C Amr and Chemistry 全都变相等

     题意:给定一个数列,每次操作仅仅能将某个数乘以2或者除以2(向下取整). 求最小的操作次数使得全部的数都变为同样值. 比赛的时候最后没实现.唉.之后才A掉.開始一直在想二分次数,可是半天想不出怎 ...

  8. xml方式封装通信数据方法

    xml方式封装通信数据方法 public static function xmlToEncode($data) { $xml = ""; foreach($data as $key ...

  9. 开启Windows 7远程桌面功能的做法

    作者:朱金灿 来源:http://blog.csdn.net/clever101 本设置方法同样适用用Vista和Windows Server 2008. 1.依次点击"开始"菜单 ...

  10. 异常:error 0152: No Entity Framework provider found for the ADO.NET provider with invariant name 'System.Data.SqlClient'

    error 0152: No Entity Framework provider found for the ADO.NET provider with invariant name 'System. ...