上一篇文章对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会自动定时同步其所在节点的自动发现规则,然后执行自动发现规则,如果采集的数据和上一次采集有异同,则推送数据到服务端。