19.2.3 资产采集与发现机制

资产采集与发现机制是资产管理的入口,目标是实现“全量、准确、及时”的资产数据获取与持续更新,为CMDB与编排系统提供可信数据源。该机制需覆盖物理机、虚拟机、容器、网络与中间件等多类型资源,并支持多源融合与去重校验。

原理草图(采集链路)

文章图片

采集范围与对象
- 计算资源:物理机、虚拟机、云主机、容器节点与Pod。
- 网络资源:交换机、路由器、防火墙、负载均衡、VIP与子网。
- 存储资源:块存储、对象存储、NAS、存储阵列。
- 中间件与应用:MySQL、Nginx、Redis、Kafka、ZK、Nacos、Keepalived、HAProxy、ProxySQL等实例与集群信息。
- 平台资源:Kubernetes集群、节点、命名空间与工作负载。

采集方式与技术手段
- 代理采集:Agent部署在主机/容器节点,采集硬件、OS、进程、端口与服务元数据。
- 无代理采集:通过API/SDK、SNMP、IPMI、SSH、日志解析进行数据拉取。
- 云平台对接:对接云厂商API获取实例、网络、存储、标签与成本信息。
- 中间件探测:基于探针或内置接口获取版本、配置、主从关系与拓扑。
- Kubernetes采集:对接API Server获取资源清单、标签、注解与状态。

安装与示例:Host Agent + 中间件探针
1)安装采集Agent(示例以Linux为主,路径与服务名可替换)

# /opt/asset-agent 安装并启动
mkdir -p /opt/asset-agent
cat >/opt/asset-agent/agent.sh <<'EOF'
#!/usr/bin/env bash
set -e
HOSTNAME=$(hostname)
IP=$(hostname -I | awk '{print $1}')
KERNEL=$(uname -r)
CPU=$(lscpu | awk -F: '/Model name/{print $2}' | xargs)
MEM=$(free -m | awk '/Mem:/{print $2}')
DISK=$(lsblk -b -o SIZE -d | awk 'NR>1{sum+=$1} END{printf "%.0f", sum/1024/1024/1024}')

cat <<JSON
{
  "hostname": "$HOSTNAME",
  "ip": "$IP",
  "kernel": "$KERNEL",
  "cpu_model": "$CPU",
  "mem_mb": $MEM,
  "disk_gb": $DISK
}
JSON
EOF
chmod +x /opt/asset-agent/agent.sh

# 输出JSON并推送到采集服务(示例HTTP)
/opt/asset-agent/agent.sh | curl -sS -X POST \
  -H "Content-Type: application/json" \
  -d @- http://cmdb.example.com/api/asset/host

预期效果:CMDB中新增主机记录,字段包含hostname、ip、kernel等。

2)中间件探针示例(Redis)

# 采集Redis版本、角色、端口
redis-cli -h 127.0.0.1 -p 6379 INFO SERVER | egrep 'redis_version|tcp_port'
redis-cli -h 127.0.0.1 -p 6379 INFO REPLICATION | egrep 'role|master_host|master_port'

字段解释:
- redis_version:版本标识,统一落库到middleware_version
- role/master_host/master_port:用于拓扑与主从关系识别

3)Kubernetes资源采集示例

# 获取节点、命名空间、工作负载
kubectl get nodes -o wide
kubectl get ns
kubectl get deploy,sts,ds -A -o wide

# 输出为JSON并传输
kubectl get nodes -o json > /tmp/k8s_nodes.json
curl -sS -X POST -H "Content-Type: application/json" \
  -d @/tmp/k8s_nodes.json http://cmdb.example.com/api/asset/k8s/nodes

发现机制与流程(含命令示例)
- 基于网络扫描:

# nmap扫描并识别开放端口
nmap -sS -p 22,80,3306,6379 10.0.0.0/24 -oG /tmp/scan.gnmap
# 提取存活IP并写入发现队列
awk '/Up$/{print $2}' /tmp/scan.gnmap > /tmp/alive.txt
  • 基于事件驱动:编排平台发布时回写资产
# 交付后回写资产登记(示例)
curl -sS -X POST http://cmdb.example.com/api/asset/register \
  -H "Content-Type: application/json" \
  -d '{"instance_id":"i-123","ip":"10.0.0.8","env":"prod","app":"order"}'
  • 基于日志与监控联动:从Prometheus目标列表发现新实例
curl -s http://prometheus:9090/api/v1/targets | jq '.data.activeTargets[].discoveredLabels.__address__'

数据标准化与去重策略(示例)

# /etc/cmdb/normalize.yaml
key_priority:
  - instance_id
  - uuid
  - hostname
  - ip
fields_map:
  cpu_model: cpu_model
  mem_mb: memory_mb
  disk_gb: disk_total_gb
source_priority:
  api: 1
  agent: 2
  scan: 3

去重策略说明:
- 以 instance_id/uuid 为主键,缺失时使用 hostname+ip 组合。
- source_priority 数值越小优先级越高,字段冲突按优先级覆盖。

一致性与变更同步
- 采集频率分层:核心资产5分钟;一般资产30分钟;低频资产每日巡检。
- 增量更新:仅提交变更字段,避免覆盖人工修正。

# 增量更新示例
curl -sS -X PATCH http://cmdb.example.com/api/asset/host/i-123 \
  -H "Content-Type: application/json" \
  -d '{"mem_mb":65536,"last_seen":"2024-01-01T10:00:00Z"}'

安全与权限
- 采集通道TLS与Token认证,敏感凭据统一托管(如Vault)。

# Token方式示例
curl -sS -X POST http://cmdb.example.com/api/asset/host \
  -H "Authorization: Bearer $ASSET_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"hostname":"node1","ip":"10.0.0.3"}'

常见排错(含命令)
- Agent无数据上报:检查网络与端口

curl -v http://cmdb.example.com/health
ss -lntp | grep 8080
  • 扫描不到端口:确认防火墙与安全组
iptables -L -n
firewall-cmd --list-all
  • K8s采集权限不足:检查RBAC
kubectl auth can-i get nodes --as=system:serviceaccount:cmdb:collector
kubectl describe clusterrole cmdb-collector
  • 数据重复:检查标准化配置与主键冲突
grep key_priority /etc/cmdb/normalize.yaml

质量指标与治理
- 资产覆盖率、准确率、更新延迟、冲突率作为核心KPI。
- 定期进行资产清理与一致性检查,确保CMDB可信可用。

练习
1)用nmap扫描你的测试网段,生成存活IP列表并写入CMDB登记接口。
2)写一个脚本,读取Redis版本与角色,输出JSON并上报。
3)为K8s采集账户配置最小权限RBAC,并验证能读取nodes与namespaces。