CMDB学习之二数据采集
首先也要调用插件的方式,来写采集数据插件,在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学习之二数据采集的更多相关文章
- crawler4j 学习(二)
crawler4j 学习(二) 实现控制器类以制定抓取的种子(seed).中间数据存储的文件夹.并发线程的数目: public class Controller { public static voi ...
- 从零开始学习jQuery (二) 万能的选择器
本系列文章导航 从零开始学习jQuery (二) 万能的选择器 一.摘要 本章讲解jQuery最重要的选择器部分的知识. 有了jQuery的选择器我们几乎可以获取页面上任意的一个或一组对象, 可以明显 ...
- Android Animation学习(二) ApiDemos解析:基本Animators使用
Android Animation学习(二) ApiDemos解析:基本Animatiors使用 Animator类提供了创建动画的基本结构,但是一般使用的是它的子类: ValueAnimator.O ...
- AspectJ基础学习之二搭建环境(转载)
AspectJ基础学习之二搭建环境(转载) 一.下载Aspectj以及AJDT 上一章已经列出了他的官方网站,自己上去download吧.AJDT是一个eclipse插件,开发aspectj必装,他可 ...
- WPF的Binding学习笔记(二)
原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...
- AJax 学习笔记二(onreadystatechange的作用)
AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...
- MyBatis学习系列二——增删改查
目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring 数据库的经典操作:增删改查. 在这一章我们主要说明一下简单的查询和增删改, ...
- MyBatis学习 之 二、SQL语句映射文件(2)增删改查、参数、缓存
目录(?)[-] 二SQL语句映射文件2增删改查参数缓存 select insert updatedelete sql parameters 基本类型参数 Java实体类型参数 Map参数 多参数的实 ...
- MyBatis学习 之 二、SQL语句映射文件(1)resultMap
目录(?)[-] 二SQL语句映射文件1resultMap resultMap idresult constructor association联合 使用select实现联合 使用resultMap实 ...
随机推荐
- Pythonx_day1
# python3中的 str 和 byte(即二进制)转换 msg = "β" # 转换为二进制,打印,‘encoding = 'utf-8'为值定转换原str的编码格式’ pr ...
- 20180929 北京大学 人工智能实践:Tensorflow笔记07
(完)
- LocalDateTime在spring boot中的格式化配置
在项目中日期格式化是最常见的问题,之前涉及的 java.util.Date 和 java.util.Calendar 类易用性差,不支持时区,非线程安全,对日期的计算方式繁琐,而且容易出错,因为月份是 ...
- SpringMVC拓展
### 原生SpringMVC有如下缺陷 参数的JSON反序列化只支持@RequestBody注解,这意味着不能在controller方法中写多个参数,如下代码是不对的 public Map test ...
- hdu 1757 矩阵连乘
- 关于HttpClient模拟浏览器请求的參数乱码问题解决方式
转载请注明出处:http://blog.csdn.net/xiaojimanman/article/details/44407297 http://www.llwjy.com/blogdetail/9 ...
- Servlet深入学习,规范,理解和实现(中)——深入理解Tomcat(一)
心得:在写这篇博客之前.我大致阅读一些关于Tomcat的书籍和博客等资料.有些资料由于时间的关系,解说的Tomcat版本号太老.有些资料能够非常好的说明Tomcat整理结构和设计思想可是非常多重要的问 ...
- Android GridView LruCache
照片墙这种功能现在应该算是挺常见了,在很多应用中你都可以经常看到照片墙的身影.它的设计思路其实也非常简单,用一个GridView控件当作“墙”,然后随着GridView的滚动将一张张照片贴在“墙”上, ...
- PHP开源网
网站地址http://www.cnblogs.com/huijieoo/
- ping 原理及ICMP协议简介
//Ping IP/域名 public static String pingIPCennect(String ipStr) { String result = ""; if ( ...