尽可能通用的运维CMDB的设计与实践(ⅠⅠ) - 自动发现

206 阅读5分钟

上一篇文章对CMDB的整体的建设思路和设计实践做了一个概要的描述。我们知道CMDB是运维的基石,也是运维最权威的数据库,建设CMDB最大的难点和痛点其实就在如何保证数据权威性,因为CMDB最大的作用在于被信任和消费,比如自动化运维、监控、ITSM、DevOps等其他周边系统。

维护CMDB数据的常用方法无外乎3种:

1 自动发现

这是最常用的采集数据的方法,比如服务器、网络设备、应用、软件等数据都可以通过自动发现的方式录入到CMDB里,以保证数据的准备性和及时性。

2 流程

流程是为了规范运维的操作与变更,对每个运维资源的生命周期进行管理,所以ITSM本身和CMDB是息息相关,ITSM的流程输出很多都会直接反馈到CMDB里,以保证数据的准确。

3 人工

一些数据比如负责人、位置信息需要人工去完善,也可以通过计算属性的方式自动填充。当然为避免人工遗漏或出错,要尽可能使用前面2种方法。

本文重点讲解维易开源CMDB对自动发现的一些思考和实践,自动发现正如其字面意思,就是自动的去发现各种各样的运维资源,资源的变更能及时的反馈到CMDB里,降低了人力维护数据的成本。自动发现的建设一般分为3步: 创建自动发现规则、模型关联自动发现规则、执行自动发现。 接下来我们对这3步进行简要的阐述。

一 自动发现规则

维易开源CMDB的自动发现规则主要包括3大类:

1.内置插件和自定义插件

内置插件是把物理机、虚拟机、硬盘、网卡的发现内置到了OneAgent(注:维易统一运维探针OneAgent,可在官网免费申请veops.cn)里。点开内置插件的自动发现规则,呈现的是采集的属性列表,如下图所示:

图片

图1.内置插件

自定义插件实际上是可以实现其他所有采集需求的,比如MySQL、Nginx、Tomcat等常用的一些软件自动发现,实现一个自定义的插件很简单,就是一段python脚本:

# -*- coding:utf-8 -*-
import json

class AutoDiscovery(object):
    @property    
    def unique_key(self):  
        """
        :return: 返回唯一属性的名字
        """        
        return
    @staticmethod 
    def attributes(): 
        """        
        定义属性字段
        :return: 返回属性字段列表, 列表项是(名称, 类型, 描述), 名称必须是英文
        类型: String Integer Float Date DateTime Time JSON        
        例如:        
        return [("ci_type", "String", "模型名称"), ("private_ip", "String", "内网IP, 多值逗号分隔")]        
        """        
        return []
    @staticmethod 
    def run():   
        """       
        执行入口, 返回采集的属性值    
        :return: 返回一个列表, 列表项是字典, 字典key是属性名称, value是属性值     
        例如: return [dict(ci_type="server", private_ip="192.168.1.1")]       
        """    
        return []

if __name__ == "__main__":    
    result = AutoDiscovery().run() 
    if isinstance(result, list): 
        print("AutoDiscovery::Result::{}".format(json.dumps(result))) 
    else:
        print("ERROR: 采集返回必须是列表")

2.网络设备的自动发现

这个发现能力同样内置在OneAgent里,通过SNMP等网络协议去采集网络设备,目前实现的主要包括交换机、路由器、防火墙、打印机。

图片

图2. 网络设备自动发现

3.公有云资源的发现

通过对接公有云厂商的开放API,主动定时轮训的方式去获取公有云资源,目前集成了阿里云、腾讯云、华为云、AWS的云主机的自动发现,后续会扩充云资源的发现。当然如果本身在云主机上部署了OneAgent,实际上也是可以用内置的虚拟机的自动发现插件来进行采集。

二 模型关联自动发现规则

1.模型属性自动发现

以网卡为例进行说明,主要包括属性映射和执行配置:

1) 属性映射

关联上内置的网卡自动发现规则后,模型的属性名和自动发现规则的属性名会进行自动匹配,如果名字不一样则需要人工来匹配。实际上每个模型可以应用多个自动发现规则,每个规则里可能采集了模型的部分属性。

2) 执行配置

首先指定自动发现规则执行的目标机器,可以的选项有:

  • 所有节点,比如物理机、虚拟机等,但是必须管理员才能配置为所有节点。
  • 具体的某个节点,比如公有云资源的自动发现或者网络设备的自动发现,都是指定具体的某个节点去执行的。
  • 从CMDB里选择,比如网卡,可以选择CMDB里所有的物理机去执行。

图片

图3. 网卡属性自动发现

其次可选择是否自动入库,一般来说自动发现的准确率如果接近100%,那么可以直接选择自动入库,即自动发现的实例会直接入库为CI。如果选择不自动入库,实例会先进入自动发现资源池,然后需要人工批量入库为CI。

2.关系自动发现

关系自动发现配置极其简单,还是以网卡为例进行说明:

如下图所示,只需配置网卡采集的属性sn(物理机的序列号,实际上对网卡模型来说是冗余字段)和物理机模型的序列号建立关系即可,当采集上来的网卡入库CMDB时,会用字段来建立和物理机之间的关系。

图片

图4. 网卡关系自动发现

三 执行自动发现

模型关联好自动发现规则之后,OneAgent会自动定时同步其所在节点的自动发现规则,然后执行自动发现规则,如果采集的数据和上一次采集有异同,则推送数据到服务端。