CMDB - 配置管理数据库 资产管理

  自动化相关的平台(基础 CMDB):
    1. 发布系统
    2. 监控
    3. 配管系统、装机
    4. 堡垒机

  CMDB的目的:
    1. 替代EXCEL资产管理 —— 资产不准确
    2. 与监控系统联动
    3. 自动装机

期望:资产管理

   实现原理:
    1. agent 机器多的时候
    2. ssh
    3. salt

  实现兼容三种模式,可扩展性

  基础的架构:
    1. 资产采集的代码
    2. API
    3. 管理平台
################
今天的目标:
  资产采集:
  - 资产采集代码
  python的脚本
  - api
  Django

创建项目:
  资产采集
    auto_clent:
      agent模式:
        1. 采集资产信息
        2. 使用requests模块发POST请求提交的资产信息,交给api,持久化
      ssh模式:
        1. 获取未采集的主机列表
        2. 远程连接(ssh)上指定的主机,执行命名采集资产信息
        3. 使用requests模块发POST请求提交的资产信息

      salt模式:
        1. 获取未采集的主机列表
        2. 远程连接(salt)上指定的主机,执行命名采集资产信息
        3. 使用requests模块发POST请求提交的资产信息
  知识点:
    1. csrf_exempt 某个视图不需要检验CSRF
    2. requests模块 data={} url编码 Django中取 request.POST
      data = json字符串 request.POST没有值 ——》 request.body
    3. 处理错误信息:
      不要用e traceback.format_exc() 错误堆栈
    4. 唯一标识:
      物理机 s/n号
      物理机 + 虚拟机:
      主机名 + 文件
      规则:
        1. 新的机器 以主机名的一个空的文件 采集信息存到文件中 当前是新增
        2. 老的机器 改主机名 文件内容更新 当前变更 文件名也更新

    5. 返回值:
      r1.content, byte
      r1.text, 字符串
      r1.json(), 反序列化的结果
    6. 线程池:
      from concurrent.futures import ThreadPoolExecutor
      pool = ThreadPoolExecutor(10)
      for host in host_list:
      pool.submit(task,host)

    7. 遵循的原则:
      开放封闭原则:
      开放: 配置
      封闭: 源码

###############################################

首先模块设计,资产采集方式 第一个种是Agent的方式采集

第二种采集方式采用中间控件机制,中控件机,首先要获取未采集数据信息的列表,然后去服务器去采集

资产采集客户端目录规划开始  创建一个项目目录这个,这个是采集目录,是直接运行在服务器程序,

    auto_client的目录规划

      bin执行文件,

      config配置文件,

      lib公共库,

      src程序逻辑,

      log日志

                     

 执行入口bin 开始

    bin

      clinet.py

import os, sys

sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from src.script import run if __name__ == '__main__':
run()

逻辑文件

  src

    engine (创建采集目录)

      agent.py

      class AgnetHandler(object):

def handler(self):
"""
Agent模式下处理资产采集
:return:
"""
    print('agent模式')
   

 

    salt.py

    

class SaltHandler(object):
def handler(self):
"""
Salt模式下处理资产采集
:return:
"""
    print(‘salt模式’)

    ssh.py

    

class SSHHandler(object):
def handler(self):
"""
SSH模式下处理资产采集
:return:
"""
    print('SSH模式')

  script.py

  


from config import setting
from src.engine import agent,salt,ssh def run():
"""
资产采集入口
:return:
"""
if setting.ENGINE == 'agent':
obj =agent.AgnetHandler()
obj.handler()
elif setting.ENGINE == 'salt':
obj = salt.SaltHandler()
obj.handler()
elif setting.ENGINE == 'ssh':
obj=ssh.SSHHandler()
obj.handler()
else:
print("不支持这个模式采集")
#这种是简单工厂模式

做可插拔的程序,写在配置文件,选项使用那一种方式去采集数据

  config

    settings.py

    

ENGINE='agent' #支持agent,salt,SSH数据采集

#########################上面的比较low 下面用反射实现

#利用反射的方式,执行采集方法,首先在配置文件写一个字典
#利用反射执行采集,开发封闭原则
ENGINE_HANDLERS = {
'agent':'src.engine.AgnetHandler',
'salt':'src.engine.SaltHandler',
'ssh':'src.engine.SSHHandler',
}

script.py

from config import setting
# from src.engine import agent,salt,ssh
import importlib def run():
"""
资产采集入口
:return:
"""
# if setting.ENGINE == 'agent':
# obj =agent.AgnetHandler()
# obj.handler()
# elif setting.ENGINE == 'salt':
# obj = salt.SaltHandler()
# obj.handler()
# elif setting.ENGINE == 'ssh':
# obj=ssh.SSHHandler()
# obj.handler()
# else:
# print("不支持这个模式采集")
#利用反射的方式,执行采集方法,首先在配置文件写一个字典
engine_path = setting.ENGINE_HANDLERS.get(setting.ENGINE) #拿到采集模式的脚本的执行路径
#'src.engine.agnet.AgnetHandler' 使用rsplit进行右分割,只是分割一次
path,engine_class=engine_path.rsplit('.',maxsplit=1)
#拿到执行模式脚本的类,使用importlib,导入
# print(path,engine_class)
module = importlib.import_module(path)
# print(module,type(module))
obj=getattr(module,engine_class)() #反射并实例化
obj.handler()

然后可以把反射写一个公用的插件

 在lib 创建一个文件,module.srting.py

import importlib

def import_sting(path):
module_path,engine_class=path.rsplit('.',maxsplit=1)
module = importlib.import_module(module_path)
return getattr(module,engine_class)

我在script.py  在修改下

from config import setting
from lib.module_srting import import_sting
def run():
"""
资产采集入口
:return:
"""
#利用反射的方式,执行采集方法,首先在配置文件写一个字典
engine_path = setting.ENGINE_HANDLERS.get(setting.ENGINE) #拿到采集模式的脚本的执行路径
engine_class = import_sting(engine_path)
obj=engine_class() #反射并实例化
obj.handler()

所有采集数据方法,都进行约束

class BaseHandler(object):
def handler(self):
'''
约束派生类
:return:
'''
raise NotImplementedError('handler() must Implemented han')

每一个 方法都要导入 基类进行继承,agent,salt ,ssh 都要继承

from .base import BaseHandler

class AgnetHandler(BaseHandler):
def handler(self):
"""
Agent模式下处理资产采集:硬盘、内存、网卡
:return:
"""
print('agent模式')
#调用pulugins.disk /plugins.momory /plugins.nerwork

CMDB学习之一的更多相关文章

  1. CMDB学习之七-实现采集错误捕捉,日志信息处理

    首先采集disk的具体实现方上代码: # !/usr/bin/env python # -*- coding:utf-8 -*- from .base import BasePlugin import ...

  2. CMDB学习之四 ——DEBUG模式

    定义一个debug,进行解析调试,到测试文件 配置文件,配置debug模式,定义环境变量, #!/usr/bin/env python # -*- coding:utf-8 -*- import os ...

  3. CMDB学习之二数据采集

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

  4. CMDB学习之六 --客户端请求测试,服务端api优化

    客户端使用agent 请求测试,agent使用的POST 请求,使用requests模块 本地采集,汇报服务端 #!/usr/bin/env python # -*- coding:utf-8 -*- ...

  5. CMDB学习之八,完成所有资产采集信息的收集

    #!/usr/bin/env python # -*- coding:utf-8 -*- import traceback from .base import BasePlugin from lib. ...

  6. CMDB学习之五服务端api

    服务端api 对发送来的数据进行处理,并返回结果,首先要创建一个Django项目 第一步,就是写URL路由在分支中写url api 主路由 from django.conf.urls import u ...

  7. CMDB学习之三数据采集

    判断系统因为是公用的方法,所有要写基类方法使用,首先在插件中创建一个基类 将插件文件继承基类 思路是创建基类使用handler.cmd ,命令去获取系统信息,然后进行判断,然后去执行 磁盘 ,cpu, ...

  8. Python 学习 第十篇 CMDB用户权限管理

    Python 学习 第十篇 CMDB用户权限管理 2016-10-10 16:29:17 标签: python 版权声明:原创作品,谢绝转载!否则将追究法律责任. 不管是什么系统,用户权限都是至关重要 ...

  9. Python学习路程CMDB

    本节内容 浅谈ITIL CMDB介绍 Django自定义用户认证 Restful 规范 资产管理功能开发 浅谈ITIL TIL即IT基础架构库(Information Technology Infra ...

随机推荐

  1. BZOJ 3626 LCA(离线+树链剖分+差分)

    显然,暴力求解的复杂度是无法承受的. 考虑这样的一种暴力,我们把 z 到根上的点全部打标记,对于 l 到 r 之间的点,向上搜索到第一个有标记的点求出它的深度统计答案.观察到,深度其实就是上面有几个已 ...

  2. 用Python讲述冯绍峰和赵丽颖的爱情故事

    昨天刷头条时得知赵丽颖当妈妈了.作为一名程序员突发奇想,不如用Python简单叙述一下冯绍峰和赵丽颖的爱情故事,于是有了本文. 代码十分简单,适合编程小白和有一些Python基础的准程序员,其中用到了 ...

  3. python 命令行下的命令参数

    本文所介绍的命令或许是在依赖包里使用的,说白了,我不太清除,由于刚开始学习,所以对知识了解不清楚,按说学习本应该学以解惑,可是为了把知识面展开的太广而影响主要知识的学习,我决定抓住主要矛盾,把有些困惑 ...

  4. Python IO编程-组织文件

    对于日常中遇到的批量任务,有些可以通过请求python完成自动化,我非常渴望拥有这些能力,在去年学习了python读写文件之后,我马上迫不及待的开始学习‘组织文件’,经过学习,我发现python组织文 ...

  5. [NOI2016]优秀的拆分(SA数组)

    [NOI2016]优秀的拆分 题目描述 如果一个字符串可以被拆分为 \(AABB\) 的形式,其中 A和 B是任意非空字符串,则我们称该字符串的这种拆分是优秀的. 例如,对于字符串 \(aabaaba ...

  6. 【Codeforces Round #421 (Div. 2) A】Mister B and Book Reading

    [题目链接]:http://codeforces.com/contest/820/problem/A [题意] 每天看书能看v页; 且这个v每天能增加a; 但是v有上限v1; 然后每天还必须往回看t页 ...

  7. Java基础学习总结(18)——网络编程

    一.网络基础概念 首先理清一个概念:网络编程 != 网站编程,网络编程现在一般称为TCP/IP编程. 二.网络通信协议及接口 三.通信协议分层思想 四.参考模型 五.IP协议 每个人的电脑都有一个独一 ...

  8. android自己定义刷新类控件

    android尽管定义了种类很丰富的控件.可是有的时候这些自己定义的控件还是不能满足我的要求,为了可以适配很多其它的需求,我们须要在原有的基础上进行自己定义控件. 今天我向大家介绍的就是android ...

  9. Atitit.软件开发的终于的设计 dsl化,ast化(建立ast, 解析运行ast)

    Atitit.软件开发的终于的设计 dsl化,ast化(建立ast, 解析运行ast) 1. 使用js,html 撰写dsl 1 1.1. 架构图 1 1.2. html 2 1.3. Js 2 1. ...

  10. HDU 4513 吉哥系列故事――完美队形II

    http://acm.hdu.edu.cn/showproblem.php?pid=4513 吉哥系列故事——完美队形II Time Limit: 3000/1000 MS (Java/Others) ...