概述
自动获取主机信息在CMDB搭建中是一个重要场景,优维广州研发中心的小伙伴Ice对于对于CMDB的主机自动发现方案做了些许整理。
作者简介:Ice Liang毕业于中山大学软件工程系。曾任职于阿里移动事业群,目前是优维广州研发中心的开发成员。
背景
本文介绍了IT资源管理中主机的自动发现的实现方法,包括主机信息从自动采集到自动上报、入库,以及后续的维护。
方案
实现自动发现,需要以下组件的配合:
agent 采集主机信息
receiver 用于接收 agent 采集的信息,并存入队列
gateway 用于给 agent 下发命令
auto_detect 从队列中读取数据,把采集信息按规则调用 cmdb 更新或新增接口
cmdb 更新、新增主机 API 接口
console, web 端展现, 需要用户干预部分的 ui 交互
设计
3.1采集
采集字段
采集策略
3.2处理
采用这种多 key 方案主要是考虑到以下场景:
- 更换网卡设备
- 虚拟机克隆
- 机器搬迁
- …
基本上,若在 IT 资源管理中找到 mac 地址一样的主机,可以认为就是同一主机,直接进行更新即可。那么是不是可以仅仅用 mac 来做唯一标志就可以了?如果网卡设备坏了,换上新的,mac 地址自然就变了,但机器还是同一台,所以还需要其他字段来辅助标志主机的唯一。
uuid 是由 agent 生成的,加上 agent 本身的 uuid 就可以很好地解决了更换网卡设备所带来的问题。而在发生虚拟机克隆的时候,uuid 会是一样的,这时候 gateway 会检测到一样的 uuid,gateway 就会通知最近连接的 agent 重新生成 uuid。
当 mac 和 uuid 在 IT 资源管理中都找不到时,就要判断 ip 是否能找到了,如果也找不到,明显就是一台新机器,直接执行新增主机操作就好。但要是 ip 找到了,却是麻烦事。
因为会有两种场景,一是先手动录入了主机,而录入主机时只有 ip 字段,mac 和 uuid 字段都是空的,这时候就可以直接更新了;要是 mac 和 uuid 不为空,就可能是只有 ip 相同,比如灾备环境的机器与生产环境的机器的 ip 一一对应,相同 ip 对应着两台主机(我们倾向提倡 IT 资源管理中主机的 ip 唯一),这时,就有可能也是要执行新增操作。所以,只能由用户来干预确认了。
使用 mac+uuid+ip 多 key 的方式来确定主机的唯一性,下面罗列出一些场景(☑️ :在IT资源管理中能找到,✖️: 在IT资源管理中没找到)
3.3冲突缓存
在 CMDB 中, 新增对 HOSTRESOLVED 对象,由 auto_detect 来新建,由 web 端来查询或更新
HOSTRESOLVED 定义为
过程:
由 console 查询 state 为 new 的纪录
拥有新建及更新主机权限的用户才能操作
如果用户选择为 create, 直接调用 cmdb 接口来新增主机
如果用户选择 update, 直接调用 cmdb 接口来更新 mac, uuid