在虚拟化部署中,ESXI 服务器的资源监控是运维核心需求。本文将带大家从零搭建一套轻量级 ESXI 监控系统,所有的组件和服务全部基于Docker 容器化部署,让大家能快速上手。

一、系统架构与核心功能

这套监控系统采用 "轻量化 + 容器化" 设计,避免传统监控工具的复杂配置,核心架构如下:ESXI主机 ←SSH→ Docker容器(Python采集脚本)→ SQLite数据库 → Flask Web面板

核心功能清单

  • 多指标采集:存储(容量 / 使用率)CPU 使用率、内存(总量 / 已用)虚拟机(数量 / 运行状态)

  • 自动定时采集:可配置采集间隔(默认 60 秒),支持失败重试

  • 数据持久化:SQLite 数据库存储历史数据,自动清理超期记录

  • Web 可视化:直观展示实时数据,支持历史数据查询

  • 告警阈值:自定义 CPU / 内存 / 存储使用率告警阈值

  • 容器化部署:一键启停,数据卷持久化,跨平台兼容

二、前置准备

准备工作:

  • 部署服务器:CentOS 7+/Ubuntu 20.04+(需安装 Docker 和 Docker Compose)

  • ESXI 主机:ESXI 6.x/7.x/8.x(需开启 SSH 服务,建议用Workstation装虚机)

  • 网络:部署服务器与 ESXI 主机网络互通(确保 22 端口可访问)

部署服务器环境

```# 安装Docker
curl -fsSL https://get.docker.com | sh

# 安装Docker Compose
curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

# 验证安装
docker --version
docker-compose --version

三、项目文件结构

```
[root@esxi_monitor_CentOS8 esxi-monitor]# tree
.
├── app.py
├── config.py
├── docker-compose.yml  #容器编排配置
├── Dockerfile
├── esxi_collector.py
├── requirements.txt
└── templates
    └── index.html

四、核心文件代码实现

1. 配置文件:config.py 集中管理所有配置,修改 ESXI 设备信息只需改这里:

```# -------------------------- ESXI设备配置 --------------------------
ESXI_DEVICES = [
    {
        "name": "ESXI-生产服务器1",  # 自定义设备名称
        "hostname": "192.168.31.68",  # 你的ESXI主机IP
        "username": "root",  # ESXI默认用户名
        "password": "VMware1!",  # 你的ESXI登录密码
        "timeout": 10  # SSH连接超时(秒)
    },
{
        "name": "ESXI-生产服务器2",
        "hostname": "192.168.31.69",  # 替换为你的ESXI IP
        "username": "root",
        "password": "VMware1!",       # 替换为你的密码
        "timeout": 10
    }

####可添加多台。。。。
    
]

# -------------------------- 监控阈值配置 --------------------------
ALERT_THRESHOLDS = {
    "cpu_usage": 80,    # CPU使用率告警阈值(%)
    "mem_usage": 85,    # 内存使用率告警阈值(%)
    "storage_usage": 90 # 存储使用率告警阈值(%)
}

# -------------------------- Web服务配置 --------------------------
WEB_CONFIG = {
    "host": "0.0.0.0",          # 监听所有网卡(容器内必需)
    "port": 5000,               # Web端口(与docker-compose一致)
    "debug": False,             # 生产环境关闭Debug
    "auto_collect_interval": 60 # 自动采集间隔(秒)
}

# -------------------------- 数据库配置 --------------------------
DB_CONFIG = {
    "db_path": "/app/data/esxi_monitor.db",  # 数据库路径(数据卷内)
    "history_limit": 1000,                   # 历史数据保留上限(条)
    "history_query_limit": 20                # Web面板显示历史条数
}

# -------------------------- 命令重试配置 --------------------------
RETRY_CONFIG = {
    "max_retries": 3,    # 命令失败最大重试次数
    "retry_interval": 2  # 重试间隔(秒)
}

# -------------------------- ESXI命令配置(兼容多版本) --------------------------
# ESXI命令配置(实验环境仅存储命令有效)
ESXCLI_COMMANDS = {
    "storage": "esxcli storage filesystem list",             # 唯一可用命令
    "cpu": "echo 'Usage: 80'",                               # 模拟CPU输出
    "memory": "echo 'Total: 16000 MB\nUsed: 9000 MB'",       # 模拟内存输出
    "vm": "echo 'VM1: World ID: 1234, Power state: Powered on\nVM2: World ID: 5678, Power state: Powered off'"            # 模拟虚拟机输出
}

2. 数据采集脚本:esxi_collector.py 实现 SSH 连接、命令执行、数据解析、数据库入库。

3. app.py(Web服务与定时任务调度核心代码)。

4. Dockerfile 用于构建 Python 运行环境,确保包含 SSH 工具依赖:

```
FROM python:3.9-slim

WORKDIR /app

# 安装SSH工具和依赖
RUN apt-get update && \
    apt-get install -y --no-install-recommends sshpass openssh-client && \
    rm -rf /var/lib/apt/lists/*

# 复制项目文件
COPY . .

# 创建数据目录
RUN mkdir -p /app/data

# 安装Python依赖
RUN pip3 install --no-cache-dir flask

EXPOSE 5000

# 启动命令
CMD ["python3", "app.py"]

5. docker-compose.yml

```
version: '3'
services:
  esxi-monitor:
    build: .  # 基于当前目录Dockerfile构建镜像
    container_name: esxi-monitor  # 自定义容器名称
    restart: always  # 容器异常退出时自动重启
    ports:
      - "5000:5000"  # 宿主机端口:容器端口映射(Web服务端口)
    volumes:
      - ./data:/app/data  # 挂载数据卷,持久化SQLite数据库
    environment:
      - TZ=Asia/Shanghai  # 设置时区,避免时间显示异常

#firewalld防火墙可根据实际放行必要访问端口

五、 ESXI 主机开启 SSH(关键)

ESXI 默认关闭 SSH,需要手动开启:

  • 登录 ESXI 控制台(Web 界面或直接操作服务器)

  • 进入「管理」→「服务」→找到「TSM-SSH」

  • 点击「启动」,并将「策略」设为「随主机启动和停止」(避免重启后失效)

  • 记录 ESXI 的 IP 地址、root 账号和密码(后续配置要用)确保部署服务器能 ping 通 ESXI 主机,且 22 端口(SSH)可访问

注意:如果某些命令在你的 ESXI 上仍不可用,只需在config.py中注释对应命令并使用模拟数据即可我这里使用的PNETLab跑了两台ESXI8(开机、登录配置ssh并开启密码认证)

六、上传项目构建镜像启动容器与验证

构建镜像运行容器并查看日志确认,根据你的 ESXI 环境修改config.py中的设备信息(IP、密码等)最后启动容器。

```
#创建项目文件夹(或直接整体上传项目解压)
mkdir -p /opt/esxi-monitor && cd /opt/esxi-monitor
# 构建镜像并启动容器(首次执行耗时较长,需耐心等待)
docker-compose up -d --build
# 查看容器运行状态(确保STATUS为Up)
docker ps | grep esxi-monitor
# 重建并启动新容器(多次验证的情况)
docker-compose down && docker-compose up -d --build
# 查看所有日志,不做过滤,确保能看到“采集线程”相关输出
docker-compose logs -f
docker exec -it esxi-monitor bash
# 若虚拟机命令不可用,临时替换为模拟数据,如果你的 ESXI 对某些命令支持不完整(例如虚拟机命令仍不可用),只需修改 config.py 中的对应命令为模拟数据即可

ESXCLI_COMMANDS = {
    # ... 其他命令保持不变 ...
    "vm": "echo ''"  # 虚拟机命令用空输出(采集时会显示0台)
}

查看日志:

Web 面板访问与验证

打开浏览器,访问 http://[部署服务器IP]:5000,进入监控面板;在「选择设备」下拉框中选择目标 ESXI 主机,查看实时数据:

  • CPU 监控:显示当前使用率与历史趋势曲线,若超过阈值则标记为红色;

  • 内存监控:展示已用 / 总量(单位 GB)及使用率,支持查看最近 20 条历史记录;

  • 存储监控:按卷展示容量使用情况,清晰区分 VMFS 分区与其他存储类型;

  • 虚拟机监控:显示运行中 / 总数量,点击「详情」可查看各虚拟机电源状态。

最后,一定要注意:

关于本次实验我使用的是论坛里大佬封装的ESXI镜像,我手动进入shell试了一下由于镜像本身问题(基于国产硬件或者定制化版本阉割...)很多指令集没有安装(后续有条件我会重新自己封装可以在PNETLab直接跑的ESXI镜像)所以我在关键代码的设计完全兼容 “真实采集” 和 “模拟兜底”,既解决了现在 ESXI 命令缺失的问题,也为未来 ESXI 恢复命令支持预留了接口,不会对正常采集产生任何影响。如果后续真实命令可用,直接修改 config.py 中的 ESXCLI_COMMANDS 为真实命令即可,采集优先级:真实命令 > 模拟值(无冲突)代码会先尝试执行 ESXI 的真实命令(如 esxcli sched cpu load get 采集 CPU、esxcli hardware memory get 采集内存),只有满足以下条件时,才会间接用到 “模拟相关逻辑”:真实命令执行失败(比如返回 {"error": "..."},如之前你的 ESXI 不支持 system resource 命令);或真实命令无有效输出(比如返回空字符串)。如果真实命令采集成功(比如未来你的 ESXI 恢复了 CPU 命令支持,能返回 Usage: 25),代码会直接解析真实数据入库,完全不会触发模拟值逻辑。

*若你的 ESXI 系统可以完全兼容并有命令支持,可以按以下步骤逐步开启 CPU、内存、虚拟机等指标的采集。前提条件:先在 ESXI 主机上手动测试以下命令是否能返回有效结果,只有命令能正常执行,才能开启对应指标采集:

  • 循序渐进:先开启一个指标(如 CPU),确认正常后再开启下一个。

  • 命令优先:必须以 ESXI 实际支持的命令为准,若命令执行失败,立即回退到模拟数据。

  • 灵活调整:解析逻辑需根据命令输出格式微调(主要是正则表达式部分)。

```
# 测试CPU命令(返回CPU使用率相关信息)
esxcli sched cpu load get
# 或
esxtop -b -n 1 | grep 'CPU '

# 测试内存命令(返回总内存和已用内存)
esxcli hardware memory get

# 测试虚拟机命令(返回虚拟机列表及状态)
esxcli vm process list
# 或
esxcli vm list

原文链接:《从 2 小时到 30 分钟!我用 Docker 重构了 ESXI 监控系统(含 Web 面板演示)》