时间:2021-07-01 10:21:17 帮助过:28人阅读
作用:用于帮助开发者通过代码远程连接服务器,并对服务器进行操作。
原理:利用SSH连接服务器
“CMDB即配置管理数据库,有时也被称为运营自动化,通过识别、控制、维护,检查企业的IT资源,从而高效控制与管理不断变化的IT基础架构与IT服务,
并为其它流程,例如事故管理、问题管理、变更管理、发布管理等流程提供准确的配置信息。”
公司以后想要搭建自动化运维平台,CMDB是搭建平台的基石。
目前而言,公司资产信息不够准确,因为都维护在excel中,维护主要人,通过CMDB可以自动采集资产信息以及做资产变更记录
70台左右物理机
?
戴尔品牌的服务器
cmdb是由三部分组成,其中包含:资产采集的中控机、API、资产管控平台 - 对于资产采集部分,通过paramiko远程操作服务器(本质SSH)并采集资产信息,然后将资产信息汇报到API,
在资产采集部分还继承了可扩展的功能,让我们定制插件时可以更加方便,实现起来也比较简单,参考django中间件的原理、开发封闭原则、工厂模式实现可插拔式的插件 - api,基于restful规范和drf组件来实现完成,主要做资产入库以及资产变更处理 - 资产管控平台,对资产数据进行数据呈现和报表的处理
用户表
部门
机房IDC
服务器
硬盘
网卡
内存
变更记录
?
菜单表
权限表
角色表
角色和权限关系
用户和角色关系
1个人/两个人 + 运维人员
3个月~6个月
质疑时间短,开发资产采集很简单,资产管控平台也是由你来开发
对于bug没有太多印象,主要是在想怎么优化我的资产采集部分中的代码,后来参考了django中的中间件的源码和工厂模式、开发封闭原则实现了可以自由配置的插件。
paramiko模块
pymysql操作数据库
单例模式(日志中应用)
日志
堆栈信息
对象进行数据封装 BaseReponse
class BaseResponse(object): def __init__(self): self.status = True self.data = None self.error = None ? @property def dict(self): return self.__dict__
类的约束
class BasePlugins: def process(self, hostname, func): raise NotImplementedError(f"{self.__class__.__name__}类必须定义process方法")
通过字符串的形式导入一个模块
import importlib module = importlib.import_module("xxx.xx.xx.csss")
反射,通过字符串形式去操作对象中属性
getattr:通过字符串得到对象或者方法 setattr:把setattr(self, sex, ‘男‘)变为sex=男 delattr:不经常用 hasattr:判断对象中是否有这个对象或者方法
线程池的应用
导入包时,自动加载 __init__.py
文件
requests模块的应用,向网页发送请求并且可以模拟请求方法
requests.get(url=‘...‘) ? requests.post(url="...",data={}) ? requests.post(url="...",json={})
traceback 获取程序报错位置等详细信息
import traceback msg = traceback.format_exc() loggers.log(msg)
运用了配置文件
settings中定义DEBUG,判断是否要用文件的格式获取数据方便调试。
# 需要获得信息的类和路径 GET_DICT = { # "board": "lib.plugins.board.Board", # "cpu": "lib.plugins.cpu.Cpu", "disk": "lib.plugins.disk.Disk", # "memory": "lib.plugins.memory.Memory", # "nic": "lib.plugins.nic.Nic", } ? # linux系统接口 SYSTEM_PORT = 22 ? ? # linux用户名 SYSTEM_USER = "root" ? ? # 线程数量 THREAD_NUM = 10 ? # 是否使用文件传数据 DEBUG = False ? # 是SSH还是SALT模式 MODE = "SSH" # SSH或SALT
开放封闭原则
配置开放
源码封闭
工厂模式——详细请见扩展
概念:工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。 简单解释:工厂模式依然是一种创建型设计模式,作为工厂,它所关心的是产品的产生,也就是对象的创建,
我们利用工厂来创建对象,而不必我们亲自创建对象,我们无需去理解如何创建对象,只需要向工厂提出要求,让工厂去根据你的要求,给你生产你要的产品,给你相应的对象,这种模式便叫做工厂模式。 ? 工厂模式的优点: - 松耦合,对象的创建独立于类的实现 - 客户端无需了解创建对象的类,只需知道需要传递的接口,方法和参数就能够创建所需要的对象 - 很容易扩展工厂添加其他类型对象的创建,而使用者只需要改变参数就可以了
单独编写api,为了给其他系统提供数据支持(接口)
维护的数据库连接比较多,修改不方便
import threading ? class Singleton(object): instance = None lock = threading.RLock() def __new__(cls, *args, **kwargs): if cls.instance: return cls.instance with cls.lock: if not cls.instance: cls.instance = object.__new__(cls) return cls.instance return cls.instance
装饰器
def Singleton(cls): _instance = {} ? def _singleton(*args, **kargs): if cls not in _instance: _instance[cls] = cls(*args, **kargs) return _instance[cls] ? return _singleton ? ? @Singleton class A(object): a = 1 ? def __init__(self, x=0): self.x = x ? ? a1 = A(2) a2 = A(3)
使用类
import time import threading class Singleton(object): _instance_lock = threading.Lock() ? def __init__(self): time.sleep(1) ? @classmethod def instance(cls, *args, **kwargs): if not hasattr(Singleton, "_instance"): with Singleton._instance_lock: if not hasattr(Singleton, "_instance"): Singleton._instance = Singleton(*args, **kwargs) return Singleton._instance ? ? def task(arg): obj = Singleton.instance() print(obj) for i in range(10): t = threading.Thread(target=task,args=[i,]) t.start() time.sleep(20) obj = Singleton.instance() print(obj)
基于metaclass方式实现——主要知识点当类实例化对象的时候调用__call__
方法
import threading ? class SingletonType(type): _instance_lock = threading.Lock() def __call__(cls, *args, **kwargs): if not hasattr(cls, "_instance"): with SingletonType._instance_lock: if not hasattr(cls, "_instance"): cls._instance = super(SingletonType,cls).__call__(*args, **kwargs) return cls._instance ? class Foo(metaclass=SingletonType): def __init__(self,name): self.name = name ? ? obj1 = Foo(‘name‘) obj2 = Foo(‘name‘) print(obj1,obj2)
__new__
方法返回的是什么?新创建的对象,内部没有数据,需要经过init来进行初始化!
django的配置文件
django的admin
数据库连接池
日志功能
内存信息——sudo dmidecode -q -t 17 2>/dev/null 注意:linux上要提前安装 yum install dmidecode ? 硬盘(安装MegaCli)——sudo MegaCli -PDList -aALL ? 网卡——sudo ip link show sudo ip addr show 主板——sudo dmidecode -t1 ? CPU——cat /proc/
中控机汇报到api的资产需要做入库以及变更记录的处理。 - 由于资产采集时是利用工厂模式实现可扩展插件,方便与扩展。在api端也是使用相同模式,对插件进行一一处理。 - 在处理资产信息时候,对操作进行交集和差集的处理从而得到删除/更新/新增资产 - 在内部通过反射进行资产变更记录的获取,最终将资产以及变更记录写入数据库。 - orm批量增加数据:bulk_create([],10)
通过日期来判断,如果时间是今天之前就是没有采集
通过Q实现复杂的SQL查询
回到顶部
cmdb知识总结
标签:方便 yum 利用 工厂 菜单 django hostname range 远程连接