# VMware AIops
[](https://pypi.org/project/vmware-aiops/) [](#readme-license)
[English](README.md) | 中文
维护者: Wei Zhou · [zhouwei008@gmail.com](mailto:zhouwei008@gmail.com)
社区维护的开源项目,非 VMware 或 Broadcom 官方产品。
[概述](#readme-overview) · [快速开始](#readme-quick-start) · [MCP 配置](#readme-mcp-configuration) · [能力与工作流](#readme-capabilities-and-workflows) · [安全与审计](#readme-safety-and-audit) · [故障排查](#readme-troubleshooting) · [配套 Skills](#readme-companion-skills) · [参考资料](#readme-reference) · [许可证](#readme-license)
## 概述
默认通过本地 Stdio 运行;请在本机配置所需目标和凭据。
AI 驱动的 VMware vCenter/ESXi VM 生命周期管理与部署工具 — 61 个工具。
范围还包括数据存储文件浏览与部署镜像发现、告警确认与重置,以及需显式启动的扫描/TTL daemon(可选配置 webhook)。告警重置可能清除多个匹配告警;guest 命令与文件传输仍受[能力参考](skills/vmware-aiops/references/capabilities.md)所述的账户和文件访问边界约束。
> **配套技能**负责其他领域:
>
> | 技能 | 范围 | 安装 |
> |------|------|------|
> | **[vmware-monitor](https://github.com/vmware-skills/VMware-Monitor)** | 只读:资源清单、健康检查、告警、事件、指标 | `uv tool install vmware-monitor` |
> | **[vmware-storage](https://github.com/vmware-skills/VMware-Storage)** | 数据存储、iSCSI、vSAN 管理 | `uv tool install vmware-storage` |
> | **[vmware-vks](https://github.com/vmware-skills/VMware-VKS)** | Tanzu 命名空间、TKC 集群生命周期 | `uv tool install vmware-vks` |
>
> **只需要只读监控?** 使用 [VMware-Monitor](https://github.com/vmware-skills/VMware-Monitor) — 代码库中零破坏性函数。
破坏性 MCP 工具默认只预览,需传 `confirm=True` 才执行;这是调用者传入的参数,不代表独立人工审批。其余写操作可能首次调用即执行。Guest 命令与文件传输仍分别受客户机账号和主机路径边界约束。
Skills.sh 示例分别固定安装器 `skills@1.7.6`(需 Node.js >=22.20.0)和仓库 release tag;这不等于锁定传递依赖。
保持 TLS 校验开启,私有 CA 通过 `SSL_CERT_FILE` 加入信任。关闭证书/主机名校验仅限隔离实验环境,会允许端点冒充和凭据拦截。
完整的 Agent 指令见 [`skills/vmware-aiops/SKILL.md`](skills/vmware-aiops/SKILL.md).
## 快速开始
需要 Python `>=3.10` 和 `uv`。
```bash
uv tool install vmware-aiops==2.5.0
vmware-aiops --help
```
目标、凭据和本地数据目录设置见 [setup guide](skills/vmware-aiops/references/setup-guide.md).
安装与配置详情(含离线安装)
### 安装
#### 第 0 步:前置条件
```bash
python3 --version # 需要 Python 3.10+
node --version # Gemini/Codex CLI 需要 Node.js 18+
```
#### 第 1 步:安装 Python 后端
所有平台共用同一个 Python 后端:
```bash
git clone --branch v2.5.0 https://github.com/vmware-skills/VMware-AIops.git
cd VMware-AIops
python3 -m venv .venv
source .venv/bin/activate
pip install -e .
```
#### 第 2 步:配置
```bash
mkdir -p ~/.vmware-aiops
cp config.example.yaml ~/.vmware-aiops/config.yaml
# 编辑 config.yaml,填入你的 vCenter/ESXi 目标信息
```
通过 `.env` 文件设置密码(推荐):
```bash
# 使用模板创建 .env 文件
cp .env.example ~/.vmware-aiops/.env
# 编辑并填入真实密码
# 然后锁定文件权限(仅所有者可读写)
chmod 600 ~/.vmware-aiops/.env
```
> **安全提示**:推荐使用 `.env` 文件而非命令行 `export`,避免密码出现在 shell 历史记录中。`.env` 文件必须设置 `chmod 600`(仅所有者可读写)。
密码环境变量命名规则:`VMWARE_{目标名大写}_PASSWORD`
- 连字符替换为下划线,全大写
- 目标 `home-esxi` → `VMWARE_HOME_ESXI_PASSWORD`
- 目标 `prod-vcenter` → `VMWARE_PROD_VCENTER_PASSWORD`
#### 安全最佳实践
- **绝不**在脚本或配置文件中硬编码密码
- **绝不**通过命令行参数传递密码(`ps` 命令可见)
- **绝不**在输出或日志中显示密码
- **始终**使用 `~/.vmware-aiops/.env` 并设置 `chmod 600`
- **始终**通过 `config.yaml` 配置连接 — 凭据自动从 `.env` 加载
- **TLS**:默认启用。仅在使用自签名证书的隔离实验环境中才禁用
- **Webhook**:默认禁用。启用后 daemon 只向您自己配置的 URL 发送(不发往任何第三方服务):所有 critical 问题(告警、事件、匹配 critical/panic/corrupt 的 ESXi 日志行、连不上的目标)和所有告警/事件类 warning——主机日志的 warning 只写入扫描日志,`info` 记录从不发送。payload 带完整的问题文本(实体名、告警名、事件消息、ESXi 日志摘录、连接错误),其中可能含主机名、IP 地址和用户名;不含您配置或 `.env` 里的任何凭据
- **代码审查**:建议在生产部署前审查[源代码](https://github.com/vmware-skills/VMware-AIops)和提交历史
- **生产环境安全**:生产环境建议使用只读的 [VMware-Monitor](https://github.com/vmware-skills/VMware-Monitor)。AI Agent 可能误解上下文并执行非预期的破坏性操作 — 已有真实案例表明,缺乏隔离的 AI 驱动基础设施工具可能删除生产数据库和整个环境。VMware-Monitor 在代码级别消除此风险:代码库中不存在任何破坏性函数
#### 第 3 步:连接 AI 工具
##### Claude Code(推荐)
```bash
# 方式一:由安装器放置 skill(推荐)
npx skills@1.7.6 add vmware-skills/VMware-AIops#v2.5.0
# 或
clawhub install @zw008/vmware-aiops --version 2.5.0
# 方式二:手工安装 skill
git clone --branch v2.5.0 https://github.com/vmware-skills/VMware-AIops.git
cd VMware-AIops
mkdir -p ~/.claude/skills/vmware-aiops
cp -r skills/vmware-aiops/. ~/.claude/skills/vmware-aiops/
```
若需工具调用(而非仅 skill 上下文),再注册 MCP Server:
```bash
claude mcp add vmware-aiops -- vmware-aiops mcp
```
> 生产环境建议改用只读的 [VMware-Monitor](https://github.com/vmware-skills/VMware-Monitor)(`npx skills@1.7.6 add vmware-skills/VMware-Monitor#v2.6.0`),代码级零破坏性。
##### Gemini CLI
```bash
npm install -g @google/gemini-cli
# Gemini CLI 启动时读取 GEMINI.md 作为项目上下文
cp skills/vmware-aiops/SKILL.md ./GEMINI.md
gemini
> 显示 ESXi 上所有虚拟机
```
若需工具调用(而非仅上下文),在 `~/.gemini/settings.json` 注册 MCP Server:
```json
{
"mcpServers": {
"vmware-aiops": {
"command": "vmware-aiops",
"args": ["mcp"],
"env": { "VMWARE_AIOPS_CONFIG": "~/.vmware-aiops/config.yaml" }
}
}
}
```
##### Codex CLI
```bash
npm i -g @openai/codex
mkdir -p ~/.codex/skills/vmware-aiops
cp skills/vmware-aiops/SKILL.md ~/.codex/skills/vmware-aiops/SKILL.md
cp skills/vmware-aiops/SKILL.md ./AGENTS.md
codex --enable skills
```
##### Aider(支持本地模型)
```bash
pip install aider-chat
# 云端
aider --conventions skills/vmware-aiops/SKILL.md
# 本地 Ollama
aider --conventions skills/vmware-aiops/SKILL.md --model ollama/qwen2.5-coder:32b
```
##### Trae IDE
将规则文件复制到项目的 `.trae/rules/` 目录:
```bash
mkdir -p .trae/rules
cp skills/vmware-aiops/SKILL.md .trae/rules/project_rules.md
```
Trae IDE 的 Builder Mode 会在启动时自动读取 `.trae/rules/` 下的 Markdown 文件。
> 注意:也可以在 Trae IDE 中安装 Claude Code VS Code 扩展,直接使用 `.claude/skills/` 格式。
##### Kimi Code CLI
```bash
# 复制技能文件到 Kimi skills 目录
mkdir -p ~/.kimi/skills/vmware-aiops
cp skills/vmware-aiops/SKILL.md ~/.kimi/skills/vmware-aiops/SKILL.md
```
##### MCP 服务器(Smithery / Glama / Claude Desktop)
MCP 服务器通过 [Model Context Protocol](https://modelcontextprotocol.io) 将 VMware 操作暴露为工具,兼容所有 MCP 客户端(Claude Desktop、Cursor 等)。
**v1.5.15+ 推荐方式**:完成 `uv tool install vmware-aiops==2.5.0` 后,**一条命令启动 MCP**:
```bash
# 推荐 — 单命令,无网络依赖
vmware-aiops mcp
# 指定配置路径
VMWARE_AIOPS_CONFIG=/path/to/config.yaml vmware-aiops mcp
```
**Claude Desktop 配置** (`claude_desktop_config.json`):
```json
{
"mcpServers": {
"vmware-aiops": {
"command": "vmware-aiops",
"args": ["mcp"],
"env": {
"VMWARE_AIOPS_CONFIG": "/path/to/config.yaml"
}
}
}
}
```
备选方案:uvx(不安装)或 legacy 入口
```bash
# 不想安装,临时运行(每次需要联网 resolve 依赖)
uvx --from vmware-aiops==2.5.0 vmware-aiops mcp
# 旧 entry point(仍可用,向后兼容)
vmware-aiops-mcp
```
> **公司 TLS 代理网络下?** uvx 可能报 `invalid peer certificate: UnknownIssuer`。
> 推荐使用上面的 `vmware-aiops mcp`(无需联网),或 `export UV_NATIVE_TLS=true`。
---
##### 独立 CLI(无需 AI)
```bash
source .venv/bin/activate
vmware-aiops vm power-on my-vm --target home-esxi
vmware-aiops deploy ova ./ubuntu.ova --name my-vm --target home-esxi
vmware-aiops datastore browse datastore1 --target home-esxi
```
---
## MCP 配置
将以下配置复制到 MCP 客户端的本地 Stdio 配置中。客户端需要能找到 `uvx`;首次安装所需包时需要访问包源。
```json
{
"mcpServers": {
"vmware-aiops": {
"command": "uvx",
"args": ["--from", "vmware-aiops==2.5.0", "vmware-aiops-mcp"],
"env": {
"VMWARE_AIOPS_CONFIG": "~/.vmware-aiops/config.yaml"
}
}
}
}
```
## 能力与工作流
### ⚡ 快速调查报告(只读)
总览 → 调查 → 处置,一次对话完成。五个有主见的只读报告在**服务端聚合并关联**数据、返回高信号结果(绝不灌 raw inventory),让你在动手改之前先判断*该看哪里*。每个都支持 `--html` 生成**自包含离线 HTML 快照**(零外链;下钻细节用原生 `` 折叠,零 JavaScript)。全部委托 [vmware-monitor](https://github.com/vmware-skills/VMware-Monitor) 库、用 AIops 自己的 vCenter 连接。
| 问题 | 命令 | 关联什么 |
|------|------|---------|
| **"现在该关注什么?"**(全 vCenter) | `vmware-aiops attention` | 所有 vCenter 合并成一个全局排序异常榜;连不上的目标优雅降级 |
| **"有什么着火了?"**(全集群) | `vmware-aiops summary` | 每集群主机 + VM 电源 + 实时 CPU/内存 + 告警 → Top-N 异常榜 + 每集群状态 |
| **"这个 VM 周围在发生什么?"** | `vmware-aiops investigate vm <名>` | VM 状态 + 主机 + 集群 + 背后数据存储 + 快照 + 告警 + 性能 + 合并事件时间线 |
| **"这个主机周围在发生什么?"** | `vmware-aiops investigate host <名>` | 主机状态 + 集群 + 其上 VM + 挂载数据存储 + 告警 + 性能 + 关联时间线 |
| **"这个数据存储周围在发生什么?"** | `vmware-aiops investigate datastore <名>` | 容量/剩余 + 挂载主机 + 落其上的 VM + 告警 + 关联时间线 |
```bash
vmware-aiops attention # 现在该关注什么,全 vCenter
vmware-aiops investigate vm web-01 --hours 72 # 一个 VM 的全貌,然后处置
vmware-aiops investigate vm web-01 --html # → 离线快照写入 ~/vmware-health/
```
MCP 下对应工具为 `get_cluster_health_summary`、`get_cross_vcenter_attention`、`investigate_vm`、`investigate_host`、`investigate_datastore`。(需安装 `vmware-monitor`。)
#### 快速安装(推荐)
支持 Claude Code、Cursor、Codex、Gemini CLI、Trae 等 30+ AI 工具:
```bash
# 通过 Skills.sh 安装
npx skills@1.7.6 add vmware-skills/VMware-AIops#v2.5.0
# 通过 ClawHub 安装
clawhub install @zw008/vmware-aiops --version 2.5.0
```
#### PyPI 安装(无需访问 GitHub)
```bash
# 通过 uv 安装(推荐)
uv tool install vmware-aiops==2.5.0
# 或通过 pip 安装
pip install vmware-aiops==2.5.0
# 国内镜像加速
pip install vmware-aiops==2.5.0 -i https://pypi.tuna.tsinghua.edu.cn/simple
```
#### 离线 / 气隙环境安装(从源码)
本项目使用现代 PEP 517 构建系统(hatchling),因此**故意不提供 `setup.py`**——这是
预期行为,而非缺失文件。如果你克隆源码后遇到 `ERROR: File "setup.py" or "setup.cfg"
not found ... editable mode currently requires a setuptools-based build`,说明你的
`pip` 版本早于 21.3,无法对非 setuptools 后端执行*可编辑*(`-e`)安装。可编辑模式只是
开发便利,运行本工具并不需要——任选其一:
```bash
# 从源码树安装——普通(非可编辑)安装会构建 wheel:
pip install . # 不要用 pip install -e .
# ……或先升级 pip,可编辑安装同样可用:
pip install --upgrade pip && pip install -e .
```
对于**完全气隙的主机**,在联网机器上构建 wheel 再拷贝过去——目标主机无需任何网络:
```bash
# 在联网机器上,把本包及其依赖收集为 wheel:
pip wheel . -w dist # → dist/*.whl (或用 uv build,仅构建本包)
# 把 dist/ 拷贝到气隙主机,然后离线安装:
pip install --no-index --find-links dist vmware-aiops
```
---
### 功能总览
#### 本技能覆盖的功能
| 分类 | 工具 | 数量 |
|------|------|:----:|
| **VM 生命周期** | 开关机、TTL 自动删除、Clean Slate | 6 |
| **部署** | OVA、模板、链接克隆、批量克隆/部署 | 8 |
| **Guest Ops** | 执行命令、上传/下载文件、批量制备 | 5 |
| **Plan/Apply** | 多步骤编排与回滚 | 4 |
| **集群** | 创建、删除、HA/DRS 配置、添加/移除主机 | 6 |
| **数据存储** | 浏览文件、扫描镜像 | 2 |
| **网络** | dvSwitch 端口组 列出/创建、主机 VMkernel 列出/添加/移除、DF 位 MTU 路径 ping | 6 |
| **权限** | 当前使用哪个账号,以及它是否具备每个工具所需的权限(`get_access_info`,CLI `access-info`) | 1 |
#### CLI vs MCP:如何选择
| 场景 | 推荐模式 | 原因 |
|------|:-------:|------|
| **本地/小模型**(Ollama、Qwen <32B) | **CLI** | 上下文占用 ~2K tokens vs MCP ~10K;小模型难以处理 61 个工具的 schema |
| **Token 敏感场景** | **CLI** | SKILL.md + Bash = 最小开销 |
| **云端大模型**(Claude、GPT-4o) | 均可 | MCP 提供结构化 JSON 输入输出 |
| **自动化管道 / Agent 链式调用** | **MCP** | 类型安全参数,结构化输出,无需 Shell 解析 |
| **监控 / 存储 / K8s** | 配套技能 | 见 [vmware-monitor](https://github.com/vmware-skills/VMware-Monitor)、[vmware-storage](https://github.com/vmware-skills/VMware-Storage)、[vmware-vks](https://github.com/vmware-skills/VMware-VKS) |
> **经验法则**:追求成本和兼容性选 CLI,追求结构化自动化选 MCP。
#### 架构
```
用户 (自然语言)
↓
AI CLI 工具 (Claude Code / Gemini / Codex / Aider / Continue / Trae / Kimi)
↓ 读取 SKILL.md / AGENTS.md / rules 指令
↓
vmware-aiops CLI
↓ pyVmomi (vSphere SOAP API)
↓
vCenter Server ──→ ESXi 集群 ──→ VM
或
ESXi 独立主机 ──→ VM
```
#### 版本兼容性
| vSphere 版本 | 支持状态 | 说明 |
|-------------|---------|------|
| 8.0 / 8.0U1-U3 | ✅ 完全支持 | `CreateSnapshot_Task` 已弃用,推荐 `CreateSnapshotEx_Task` |
| 7.0 / 7.0U1-U3 | ✅ 完全支持 | 所有 API 正常工作 |
| 6.7 | ✅ 兼容 | 向后兼容,已测试 |
| 6.5 | ✅ 兼容 | 向后兼容,已测试 |
> pyVmomi 在 SOAP 握手阶段自动协商 API 版本,无需手动配置。同一套代码可同时管理 7.0 和 8.0 环境。
---
### 常用工作流
#### 部署实验环境
1. 浏览数据存储查找 OVA 镜像 → `vmware-aiops datastore browse --pattern "*.ova"`
2. 从 OVA 部署 VM → `vmware-aiops deploy ova ./image.ova --name lab-vm --datastore ds1`
3. 在 VM 内安装软件 → `vmware-aiops vm guest-exec lab-vm --cmd /bin/bash --args "-c 'apt-get install -y nginx'" --user root`
4. 创建基线快照 → `vmware-aiops vm snapshot-create lab-vm --name baseline`
5. 设置 TTL 自动清理 → `vmware-aiops vm set-ttl lab-vm --minutes 480`
#### 批量克隆测试
1. 创建计划:`create_vm_plan`,包含多个克隆 + 配置步骤
2. 审查计划(展示受影响的 VM、不可逆操作警告)
3. 执行:`apply_vm_plan` 顺序执行,失败即停止
4. 如失败:`rollback_vm_plan` 逆序撤销已执行步骤
5. 对所有克隆设置 TTL 自动清理
#### 迁移 VM 到另一台主机
1. 通过 `vmware-monitor` 查看 VM 信息 → 确认电源状态和当前主机
2. 迁移:`vmware-aiops vm migrate my-vm --to-host esxi-02`
3. 验证迁移完成
---
### 虚拟机生命周期
| 操作 | 命令 | 确认 | vCenter | ESXi |
|------|------|:----:|:-------:|:----:|
| 开机 | `vm power-on ` | — | ✅ | ✅ |
| 优雅关机 | `vm power-off ` | 双重 | ✅ | ✅ |
| 强制关机 | `vm power-off --force` | 双重 | ✅ | ✅ |
| 重置 | plan 动作 `reset`,经 `create_vm_plan`(MCP;无 CLI 命令) | — | ✅ | ✅ |
| 挂起 | plan 动作 `suspend`,经 `create_vm_plan`(MCP;无 CLI 命令) | — | ✅ | ✅ |
| 创建 | `vm create --cpu --memory --disk` | — | ✅ | ✅ |
| 删除 | `vm delete ` | 双重 | ✅ | ✅ |
| 调整配置 | `vm reconfigure --cpu --memory` | 双重 | ✅ | ✅ |
| 创建快照 | `vm snapshot-create --name ` | — | ✅ | ✅ |
| 列出快照 | `vm snapshot-list ` | — | ✅ | ✅ |
| 恢复快照 | `vm snapshot-revert --name ` | 双重 | ✅ | ✅ |
| 删除快照 | `vm snapshot-delete --name [--no-wait]` | 双重 | ✅ | ✅ |
| 任务状态 | `vm task-status ` | — | ✅ | ✅ |
| 克隆 | `vm clone --new-name ` | 双重 | ✅ | ✅ |
| 迁移 | `vm migrate --to-host ` | 双重 | ✅ | ❌ |
| **设置 TTL** | `vm set-ttl --minutes ` | 双重 | ✅ | ✅ |
| **取消 TTL** | `vm cancel-ttl ` | — | ✅ | ✅ |
| **列出 TTL** | `vm list-ttl` | — | ✅ | ✅ |
| **Clean Slate** | `vm clean-slate [--snapshot baseline]` | 双重 | ✅ | ✅ |
| **Guest 执行** | `vm guest-exec --cmd /bin/bash --args "..." --user ` | 双重 | ✅ | ✅ |
| **Guest 执行(含输出)** | 仅 MCP:`run_vm_guest_command_with_output`(`username` 必填)——没有 CLI 命令 | — | ✅ | ✅ |
| **Guest 上传** | `vm guest-upload --local f.sh --guest /tmp/f.sh --user ` | 双重 | ✅ | ✅ |
| **Guest 下载** | `vm guest-download --guest /var/log/syslog --local ./syslog --user ` | — | ✅ | ✅ |
> Guest Operations 需要 VM 内运行 VMware Tools,且客户机账号必须显式指定——CLI 用 `--user`,MCP 用 `username`。没有默认值,所以任何调用都不会在没选 root 的情况下以 root 身份执行。`run_vm_guest_command_with_output`(仅 MCP,CLI 没有对应命令)自动检测 Linux/Windows shell 并捕获 stdout/stderr。
#### Plan → Apply(多步操作编排)
当操作涉及 2+ 步骤或 2+ 台 VM 时,自动使用 plan/apply 工作流:
| 步骤 | 说明 |
|------|------|
| 1. **创建 Plan** | AI 调用 `create_vm_plan` — 校验操作、检查 vSphere 中目标是否存在、生成带回滚信息的 plan |
| 2. **审查** | AI 展示 plan 给用户:步骤、影响的 VM、不可逆操作警告 |
| 3. **执行** | `apply_vm_plan` 先预览;`confirm=True` 时按顺序执行,某步失败立即停止。每个受门控的步骤都按其自身工具的方式检查;iSCSI/重扫步骤会被拒绝(请用 vmware-storage) |
| 4. **回滚**(如失败) | 询问用户是否回滚,`rollback_vm_plan` 逆序撤销已执行步骤(不可逆操作跳过);每个破坏性回滚步骤先经检查,检查拒绝即停止回滚 |
Plan 存储在 `~/.vmware-aiops/plans/`,成功后自动删除,超过 24 小时自动清理。
### VM 部署与制备
| 操作 | 命令 | 速度 | vCenter | ESXi |
|------|------|:----:|:-------:|:----:|
| OVA 部署 | `deploy ova --name ` | 分钟级 | ✅ | ✅ |
| 模板部署 | `deploy template --name ` | 分钟级 | ✅ | ✅ |
| 链接克隆 | `deploy linked-clone --source --snapshot --name ` | 秒级 | ✅ | ✅ |
| 挂载 ISO | `deploy iso --iso "[ds] path/to.iso"` | 即时 | ✅ | ✅ |
| 转为模板 | `deploy mark-template ` | 即时 | ✅ | ✅ |
| 批量克隆 | `deploy batch-clone --source --count ` | 分钟级 | ✅ | ✅ |
| 批量部署 (YAML) | `deploy batch spec.yaml` | 自动 | ✅ | ✅ |
### 集群管理
| 操作 | 命令 | 确认 | vCenter | ESXi |
|------|------|:----:|:-------:|:----:|
| 集群信息 | `cluster info ` | — | ✅ | ❌ |
| 创建集群 | `cluster create [--ha] [--drs]` | — | ✅ | ❌ |
| 删除集群 | `cluster delete ` | 双重 | ✅ | ❌ |
| 添加主机 | `cluster add-host --host ` | 双重 | ✅ | ❌ |
| 移除主机 | `cluster remove-host --host ` | 双重 | ✅ | ❌ |
| 配置 HA/DRS | `cluster configure [--ha/--no-ha] [--drs/--no-drs]` | 双重 | ✅ | ❌ |
> `remove-host` 要求主机先进入**维护模式**;主机会被移出集群,作为独立主机放入数据中心的主机文件夹。
### 告警管理
| 操作 | 命令 | 确认 | vCenter | ESXi |
|------|------|:----:|:-------:|:----:|
| 列出已触发告警 | `alarm list [--target ]` | — | ✅ | ❌ |
| 确认告警 | `alarm acknowledge ` | — | ✅ | ❌ |
| 清除(重置)告警 | `alarm reset ` | 双重 | ✅ | ❌ |
> **影响范围**:vSphere 没有按单个告警清除的 API。`alarm reset` 使用 `AlarmManager.ClearTriggeredAlarms`,会清除与指定告警的实体类型(host/VM/all)和当前状态(red/yellow)匹配的**所有**已触发告警,而不仅是指定的那一条。命令会先查找指定告警(名称写错会立即失败,不会清除任何告警),输出中的 `scope` 字段报告实际清除范围。若底层问题仍存在,被清除的告警会自动重新触发。
### 数据存储浏览
| 功能 | vCenter | ESXi | 说明 |
|------|:-------:|:----:|------|
| 浏览文件 | ✅ | ✅ | 列出数据存储中任意路径的文件/文件夹 |
| 扫描镜像 | ✅ | ✅ | 发现所有数据存储中的 ISO、OVA、OVF、VMDK 文件 |
### 定时扫描与通知
| 功能 | 说明 |
|------|------|
| 守护进程 | 基于 APScheduler,可配置间隔(默认 15 分钟) |
| 多目标扫描 | 依次扫描所有配置的 vCenter/ESXi 目标 |
| 扫描内容 | 每轮:已触发告警、最近 `lookback_hours` 内的 vCenter 事件,以及 ESXi 主机日志 `hostd`、`vmkernel`、`vpxa` 的新增行 |
| 主机日志 | 增量读取:同一个 daemon 进程内每行只报告一次(daemon 重启后会把每个日志的最后 500 行再读一遍)。日志轮转,或两轮之间新增超过 500 行时,会追加一条 `info` 记录说明哪些行没被扫描。读取主机日志需要 `Global.Diagnostics` 权限,vCenter 内置的 Read-Only 角色不含该权限;读不到的日志会变成一条带原因的 `info` 记录,绝不会被当成“一切正常” |
| 日志分析 | 匹配 error、fail、critical、panic、lost access、cannot、timeout、refused、corrupt 的主机日志行——含 critical/panic/corrupt 的为 `critical`,其余为 `warning` |
| 结构化日志 | JSONL 输出到 `~/.vmware-aiops/scan.log`——记录所有问题,包括 `info` 记录 |
| Webhook 通知 | 支持 Slack、Discord 或任意 HTTP 端点。发送所有 critical 问题和所有告警/事件类 warning;主机日志的 warning 只写入扫描日志,`info` 记录从不发送 |
| 每轮摘要 | daemon 日志输出里每轮一行:发现数(以及其中发往 webhook 的数量)、读不到的主机日志数、有未扫描行的日志数、失败的扫描环节数。只要有环节失败或某个目标连不上,就显示 `Scan INCOMPLETE`,绝不会说“一切正常” |
### CLI 命令参考
```bash
# 环境诊断
vmware-aiops doctor # 检查环境、配置、连通性
vmware-aiops doctor --skip-auth # 跳过 vSphere 认证检查(更快)
vmware-aiops access-info [--tool ] [--target ] # 当前账号 + 每个工具的权限
# MCP 配置生成
vmware-aiops mcp-config generate --agent goose # 生成 Goose 配置
vmware-aiops mcp-config generate --agent claude-code # 生成 Claude Code 配置
vmware-aiops mcp-config list # 列出所有支持的 Agent
# 虚拟机操作
vmware-aiops vm power-on|power-off|reset|suspend
vmware-aiops vm create --cpu 4 --memory 8192 --disk 100
vmware-aiops vm delete
vmware-aiops vm reconfigure --cpu 4 --memory 8192
vmware-aiops vm snapshot-create|snapshot-list|snapshot-revert|snapshot-delete
vmware-aiops vm snapshot-delete --name --no-wait # 异步发起,立即返回 task id
vmware-aiops vm task-status # 轮询异步任务状态
vmware-aiops vm clone --new-name
vmware-aiops vm migrate --to-host
vmware-aiops vm set-ttl --minutes 60 # 60 分钟后自动删除
vmware-aiops vm cancel-ttl # 取消 TTL
vmware-aiops vm list-ttl # 查看所有 TTL
vmware-aiops vm clean-slate --snapshot baseline # 恢复基线快照(双重确认)
# Guest Operations(需要 VMware Tools)
vmware-aiops vm guest-exec my-vm --cmd /bin/bash --args "-c 'whoami'" --user root
vmware-aiops vm guest-upload my-vm --local ./script.sh --guest /tmp/script.sh --user root
vmware-aiops vm guest-download my-vm --guest /var/log/syslog --local ./syslog.txt --user root
# Plan → Apply(多步操作编排)
vmware-aiops plan list # 查看待执行/失败的 plan
# 部署
vmware-aiops deploy ova ./ubuntu.ova --name my-vm --datastore ds1 # 从 OVA 部署
vmware-aiops deploy template golden-ubuntu --name new-vm # 从模板部署
vmware-aiops deploy linked-clone --source base-vm --snapshot clean --name test-vm # 链接克隆(秒级)
vmware-aiops deploy iso my-vm --iso "[datastore1] iso/ubuntu-22.04.iso" # 挂载 ISO
vmware-aiops deploy mark-template golden-vm # 转为模板
vmware-aiops deploy batch-clone --source base-vm --count 5 --prefix lab # 批量克隆
vmware-aiops deploy batch deploy.yaml # 从 YAML 批量部署
# 集群
vmware-aiops cluster info my-cluster # 集群详情
vmware-aiops cluster create my-cluster --ha --drs # 创建集群
vmware-aiops cluster delete my-cluster # 删除集群(双重确认)
vmware-aiops cluster add-host my-cluster --host esxi-03 # 添加主机(双重确认)
vmware-aiops cluster remove-host my-cluster --host esxi-03 # 移除主机(双重确认)
vmware-aiops cluster configure my-cluster --ha --drs # 配置 HA/DRS(双重确认)
# 告警管理
vmware-aiops alarm list # 列出已触发告警
vmware-aiops alarm acknowledge esxi-01 "Host memory usage" # 确认告警
vmware-aiops alarm reset esxi-01 "Host memory usage" # 清除告警(双重确认;清除所有匹配实体类型+状态的告警)
# 数据存储(浏览和扫描镜像保留在 aiops;iSCSI/vSAN 已迁移至 vmware-storage)
vmware-aiops datastore browse datastore1 --path "iso/" # 浏览数据存储
vmware-aiops datastore scan-images --target home-esxi # 扫描所有数据存储的镜像
# 扫描与守护进程
vmware-aiops scan now [--target ]
vmware-aiops daemon start|stop|status
# 配套技能负责的操作:
# vmware-monitor: 资源清单、告警、事件、传感器
# vmware-storage: 数据存储管理、iSCSI、vSAN
# vmware-vks: Tanzu/TKC 集群生命周期
```
---
## 安全与审计
### 安全特性
扫描通知失败只报告 HTTP 状态或异常类型。通知诊断与审计摘要不引用原始 webhook 响应、传输错误或连接异常,避免写入其中可能包含的端点令牌。
| 功能 | 说明 |
|------|------|
| 预演模式(Dry-Run,**仅 CLI**) | 加 `--dry-run` 只打印将要发出的 API 调用而不执行;除 `deploy iso`、`deploy mark-template`、`vm cancel-ttl`、`vm guest-download` 外,每个 CLI 写操作都支持 |
| Plan → Confirm → Execute → Log | CLI 工作流:展示当前状态、确认变更、执行、审计日志 |
| 双重确认(**仅 CLI**) | 破坏性与部署类 CLI 命令(`vm` power-off, delete, reconfigure, snapshot-revert/delete, clone, migrate, set-ttl, clean-slate, guest-exec, guest-upload; `deploy` ova, template, linked-clone, batch, batch-clone, mark-template; `cluster` delete, add-host, remove-host, configure, drs-rule-set/create/delete; `alarm reset`)需连续两次确认,无绕过参数 |
| MCP 上只有破坏性工具需要确认 | agent 通过 MCP 看到的 43 个写工具里,23 个(所有标注为破坏性的工具,加上 `migrate_vm` 和网络/DRS 编写类工具)先预览、需 `confirm=True` 才执行;其余 20 个(创建、克隆、部署、开机、改配置、创建快照、加主机、模板与 ISO 操作、guest 下载、创建计划、确认告警)**第一次调用就直接执行**。没有审批分级、没有只读开关。决定一次写入能否落地的是 vCenter 账号的权限,记录它的是审计日志。见[真正保护你的是什么](#真正保护你的是什么) |
| 拒绝记录 | 用户在 CLI 拒绝的操作也会记录到审计日志,便于安全审计 |
| 审计日志 | 所有操作记录到 `~/.vmware-aiops/audit.log`(JSONL),包含操作前后状态 |
| 输入校验 | VM 名称长度/格式、CPU(1-128)、内存(128-1048576 MB)、磁盘(1-65536 GB)参数校验 |
| 密码保护 | 通过 `.env` 加载密码并检查文件权限(warn if not 600),不出现在 shell 历史 |
| 配置文件内容 | `config.yaml` 仅存储主机名、端口和 `.env` 引用路径,**不含密码或 Token** |
| SSL 自签名 | 仅用于 ESXi 自签名证书的隔离实验环境;生产环境应使用 CA 签名证书 |
| Prompt 注入防护 | vSphere 事件消息和主机日志在输出前进行截断、控制字符清理和边界标记包裹 |
| Webhook 数据范围 | **默认禁用**。配置后,daemon 只向你配置的 URL 发送:所有 critical 问题(告警、事件、匹配 critical/panic/corrupt 的 ESXi 日志行、连不上的目标)和所有告警/事件类 warning——主机日志的 warning 只写入扫描日志,`info` 记录从不发送。每条问题带实体名和消息:经过清洗的告警、事件或 ESXi 日志文本,或不含原始异常的连接失败类型;运维文本可能含主机名、IP 地址和用户名。不会发送 skill 配置或 `.env` 里的任何凭据 |
| 最小权限 | 推荐使用专用 vCenter 服务账户,仅授予所需最小权限。仅需监控时使用 [VMware-Monitor](https://github.com/vmware-skills/VMware-Monitor) |
| 任务等待 | 所有异步操作等待完成并报告结果 |
#### vCenter vs ESXi 对比
| 功能 | vCenter | ESXi 独立模式 |
|------|:-------:|:----:|
| vMotion 迁移 | ✅ | ❌ |
| 跨主机克隆 | ✅ | ❌ |
| 集群管理 | ✅ | ❌ |
| 所有 VM 生命周期操作 | ✅ | ✅ |
| OVA/模板/链接克隆部署 | ✅ | ✅ |
| 数据存储浏览和扫描 | ✅ | ✅ |
| 快照 | ✅ | ✅ |
| Guest 操作 | ✅ | ✅ |
> 资源清单、告警、事件、传感器、主机服务、扫描已迁移至 [vmware-monitor](https://github.com/vmware-skills/VMware-Monitor)。
#### 真正保护你的是什么
上表里的两类保护措施分别属于**两个不同的入口**,必须说清楚哪条适用于哪个——
搞错比完全没有保护更糟:**你相信存在的那道闸门,正是你不再为它做补偿的那一道。**
**CLI 上**,破坏性命令会连问两次、没有绕过参数,除 `deploy iso`、`deploy mark-template`、
`vm cancel-ttl`、`vm guest-download` 外,每个写操作都可用 `--dry-run` 预览。
这防的是人手误敲的命令,**防不住 agent**——一个 `yes |` 就能同时满足两次确认。
**MCP 上**,所有标注为破坏性的工具,加上 `migrate_vm` 和网络/DRS 编写类工具——43 个写工具中的 23 个,包括 `reset_vcenter_alarm`、`power_off_vm`、`migrate_vm`、
`delete_cluster`,以及快照、guest、TTL、Clean Slate 和计划类工具——都接受同一个参数
`confirm`,默认是不写入的预览:不带参数调用只返回影响范围(blast radius),什么都不改。
`confirm=True` 会重新测量;如果预览发现阻断项(VM 里 VMware Tools 没在运行、目标主机处于
维护模式、集群里还有主机、快照不存在或重名)或有读不到的字段,调用会被拒绝,返回教学性
错误并在审计中记为失败。`delete_vm` 还要求把预览里的 `acknowledge_with` 原样传回,
VM 在预览之后变了、处于开机或挂起状态都会被拒绝。其余 20 个写工具——创建、克隆、部署、
开机、改配置、创建快照、加主机、模板与 ISO 操作、guest 下载、创建计划、确认告警——第一次调用就执行。确认不是授权,所以 `VMWARE_READ_ONLY` 开关依然不恢复
(它只在 MCP 路径上生效,有 shell 的 agent 走 CLI 就绕过去了)。预览换来的东西更窄:
agent 不会销毁一个它没看过的东西。
**真正决定一次写入能否落地的,是 vCenter/ESXi 服务账号。** 给这个 skill 一个
刚好够用、不多一分的账号;其余的由 vCenter 自己拒绝,对所有入口一视同仁,从
skill 内部无法绕过。**想让 agent 只读,就给它一个只读的 vCenter 角色**——一个
决定,在它被作出的地方生效。之后每一次调用都会在调用方看到结果之前写入
`~/.vmware/audit.db`,这是你事后弄清发生过什么的依据。`~/.vmware/rules.yaml` 里可选的
`deny` 规则会在每次 MCP 调用前检查,可以拒绝操作——例如对标注了
`environment: production` 的目标的写入。随包附带的基线什么都不拒绝,而且规则与工具
运行在同一进程内:它是 RBAC 之上的护栏,不是替代品。
**`run_vm_guest_command` 是最需要想清楚的那个。** 它用传入的凭据在客户机里执行调用方
给的任意命令——它的 `username` 是必填项(没有默认账号);没有任何东西限制这条命令的内容。
**客户机账号是与 vCenter 账号相互独立的第二道授权边界**——一个只读的 vCenter
角色约束不了这个工具在 VM *内部*做什么。skill 自身不保存客户机凭据:在 MCP 上它们是
agent 看得到的工具参数(审计行里会脱敏密码)。请传入最小权限的客户机账号,不要把
agent 用不到的客户机凭据交给它。`upload_vm_guest_file` 读取前会经过 Policy 路径检查:受保护的 skill 配置和凭据、策略/审计/token 文件、已登记的 TLS 文件及设备/进程路径都会被拒绝。HTTPS 模式默认禁止主机文件访问,只有设置 `VMWARE_MCP_FILE_ROOT` 后才允许在该根目录内访问。其余允许上传的文件与 guest 命令执行仍属于敏感管理能力。
哪些工具有闸门、哪些没有,完整清单见
[references/capabilities.md](skills/vmware-aiops/references/capabilities.md#what-gates-a-write);
那里的数字由测试套件对着真实工具注册表核对,不是手工维护的。
---
### 远程访问(HTTPS)与限制工具
默认情况下 `vmware-aiops mcp` 通过 stdio 服务一个本地客户端,并提供全部工具。以下两个选项可以改变这一点
(需 vmware-policy ≥ 1.21.0)。
**通过 HTTPS 提供服务**,让其他机器上的客户端连接。每个调用者都需要一个 bearer token:
```bash
vmware-audit token create alice # 只显示一次,交给 alice
vmware-audit token list # 只列名字
vmware-audit token revoke alice # 下一个请求起即拒绝,无需重启
vmware-aiops mcp --transport https --host 0.0.0.0 --port 8443 \
--cert /etc/vmware-mcp/server.pem --key /etc/vmware-mcp/server-key.pem \
--public-name mcp.example.com
```
连接客户端(以 Claude Code 为例;任何支持 streamable HTTP 和自定义请求头的 MCP 客户端都可以):
```bash
claude mcp add --transport http vmware-aiops https://mcp.example.com:8443/mcp \
--header "Authorization: Bearer $VMWARE_MCP_TOKEN"
```
```json
{
"mcpServers": {
"vmware-aiops": {
"type": "http",
"url": "https://mcp.example.com:8443/mcp",
"headers": { "Authorization": "Bearer ${VMWARE_MCP_TOKEN}" }
}
}
}
```
- 没有 token 时服务不会启动;`--public-name` 之外的 Host/Origin 一律拒绝;绑定端口前会自检,确认未认证请求得到 401。
证书要用客户端信任、且覆盖这些名字的证书。
- 在同一台机器上由反向代理终结 TLS 时,用 `--transport http --host 127.0.0.1 --public-name mcp.example.com`,
并让代理透传 `Authorization` 头。
- 负载均衡或网关在另一台机器上时,保持 `--transport https`(自签证书也可以),在 `--public-name` 里写上负载均衡
转发时带的 `Host` 名,并让它透传 `Authorization`。健康检查可以用 `GET /healthz`:不需要 token,只返回
`{"status": "ok"}`(需 vmware-policy ≥ 1.23.0)。
- 每个请求带上 `traceparent` 或 `X-Request-ID`,它会记进审计记录;用 `vmware-audit log --correlation-id ID`
就能查到平台上某一次请求对应的调用。
- 会读写本机文件的工具(这里是:虚拟机文件上传/下载、OVA 和部署 spec 文件)永远碰不到本机的配置、token、审计日志和 TLS 私钥;通过网络访问时,
除非用 `VMWARE_MCP_FILE_ROOT` 指定一个目录,否则这些工具不能访问本机文件(需 vmware-policy ≥ 1.23.1)。
- 审计日志把每个调用者记为 `token:<名字>`。调用并行执行,每个 target 最多 `VMWARE_MCP_POOL_SIZE`(默认 2)
个会话;每个会话都是在该 target 上的一次登录,一个调用最多等待 300 秒拿到会话。
- **能连到这个端点的人,都以该 server 配置的账号操作。** token 只用来识别调用者,不在平台上授予任何权限。
每个权限级别单独起一个端点。
- **一个端点给多人或多种角色用:** 先运行一次 `vmware-audit roles enable`,再给每个 token 指定角色(`vmware-audit token create 名字 --role reader`,或在 `roles.yaml` 里定义可用的工具和 target;需 vmware-policy ≥ 1.24.0)。角色只能限定这个 token 在本端点上能调用什么,不能超出账号本身的权限。详见 vmware-policy README 的「网络调用者的角色」一节。
**只提供读工具,加上你选定的写工具:**
```bash
vmware-aiops mcp --expose read --allow-write acknowledge_vcenter_alarm
# 或:VMWARE_AIOPS_MCP_EXPOSE=read VMWARE_AIOPS_MCP_ALLOW_WRITE=acknowledge_vcenter_alarm vmware-aiops mcp
```
未提供的工具不会出现在客户端的工具列表里。取值错误或写工具名不存在时服务直接退出(exit 2)。
这只限制提供给客户端的工具,不是授权;账号本身仍应遵循最小权限。
详见 `skills/vmware-aiops/references/setup-guide.md`("Serving MCP over HTTPS"、"Limiting which tools are offered")。
## 故障排查
### 故障排除
#### "VM not found" 错误
vSphere 中 VM 名称区分大小写。请使用 `vmware-monitor inventory vms` 获取准确名称。
#### Guest exec 返回空输出
使用 `run_vm_guest_command_with_output` 而非 `run_vm_guest_command` — 前者自动捕获 stdout/stderr。基础版 `run_vm_guest_command` 仅返回退出码。
#### 部署 OVA 超时
大型 OVA 文件(>10GB)可能超过默认 120 秒超时。上传通过 HTTP NFC lease 进行 — 确保运行 vmware-aiops 的机器与 ESXi 之间网络稳定。
#### Plan 执行中途失败
运行 `vmware-aiops plan list` 查看失败的 plan 状态。询问用户是否使用 `rollback_vm_plan` 回滚。不可逆步骤(delete_vm)在回滚时会跳过。
#### 连接被拒 / SSL 错误
1. 验证目标可达:`vmware-aiops doctor`
2. 自签名证书:在 config.yaml 中设置 `verify_ssl: false`(仅限实验环境)
#### `doctor` 报 "no vSphere role",或所有命令都报 "session is not authenticated"
账号能登录,但没有任何 vSphere 角色,所以 vCenter 不给它会话(AIops#47)。在 vCenter 根文件夹上给它分配角色(Read-Only 或更高):Administration > Access Control > Global Permissions。改密码没有用。`vmware-aiops doctor` 会直接报出这种情况,`attention` 也会把这样的目标算作未读取(总体状态至少为 WARN)。
---
### 问题反馈与贡献
如果遇到任何报错或问题,请将错误信息、日志或截图发送至 **zhouwei008@gmail.com**。欢迎加入我们,一起维护和改进这个项目!
If you encounter any errors or issues, please send the error message, logs, or screenshots to **zhouwei008@gmail.com**. Contributions are welcome — feel free to join us in maintaining and improving this project!
## 配套 Skills
VMware Skills 家族包含 14 个 MCP Server 和共享 Policy 库。按职责选择工具: [vmware-skills](https://github.com/vmware-skills).
### 相关项目
| Skill | 范围 | 工具数 | 安装 |
|-------|------|:-----:|------|
| **[vmware-aiops](https://github.com/vmware-skills/VMware-AIops)** | VM 生命周期、部署、Guest Ops、集群、数据存储浏览、健康速览 | 49 | `uv tool install vmware-aiops==2.5.0` |
| **[vmware-monitor](https://github.com/vmware-skills/VMware-Monitor)** | 只读监控、告警、事件、对象调查 bundle | 27 | `uv tool install vmware-monitor` |
| **[vmware-storage](https://github.com/vmware-skills/VMware-Storage)** | 数据存储、iSCSI、vSAN | 11 | `uv tool install vmware-storage` |
| **[vmware-vks](https://github.com/vmware-skills/VMware-VKS)** | Tanzu 命名空间、TKC 集群生命周期 | 20 | `uv tool install vmware-vks` |
| **[vmware-nsx](https://github.com/vmware-skills/VMware-NSX)** | NSX 网络:Segment、Gateway、NAT、路由、IPAM | 33 | `uv tool install vmware-nsx-mgmt` |
| **[vmware-nsx-security](https://github.com/vmware-skills/VMware-NSX-Security)** | DFW 策略/规则、安全组、Traceflow、IDS/IPS | 21 | `uv tool install vmware-nsx-security` |
| **[vmware-aria](https://github.com/vmware-skills/VMware-Aria)** | Aria Operations 指标、告警、容量、异常检测 | 28 | `uv tool install vmware-aria` |
| **[vmware-avi](https://github.com/vmware-skills/VMware-AVI)** | AVI (NSX ALB) 负载均衡、AKO Kubernetes 操作 | 28 | `uv tool install vmware-avi` |
| **[vmware-harden](https://github.com/vmware-skills/VMware-Harden)** | 合规基线(CIS / vSphere SCG / 等保 / PCI-DSS)、Drift 检测 | 6 | `uv tool install vmware-harden` |
---
## 参考资料
变更记录: [RELEASE_NOTES.md](RELEASE_NOTES.md).
使用自己的模型和 Agent 宿主进行只读自测: [model-fit self-test](https://github.com/vmware-skills/marketplace/blob/main/MODEL_FIT_SELF_TEST.md).
### 升级到 2.0
2.0 把 MCP 工具名改成动词在前(共改名 38 处)(例如 `cluster_add_host` → `add_cluster_host`, `cluster_configure` → `configure_cluster`, `cluster_create` → `create_cluster`),完整的新旧名对照表见
[RELEASE_NOTES.md](RELEASE_NOTES.md#v200--mcp-tools-renamed-verb-first)。其他都不变:工具、参数、安全确认门和 CLI 命令都一样。
如果 agent 提示词、脚本或 `~/.vmware/rules.yaml` 里写了工具名,请改成新名(但已保存计划文件里的 `action` 动作词不要改——`cluster_add_host`、`storage_rescan` 这类是计划动作,不是工具名,保持原样)——不过用旧名写的 deny 规则在
vmware-policy ≥ 1.18 下仍然生效(`vmware-audit policy` 会列出因改名而多匹配的规则),vmware-pilot ≥ 1.13 也会自动转换已保存工作流里的旧名。
如果还有 2.0 之前的安装共用这个 `rules.yaml`,请把它的 vmware-policy 也升到 ≥ 1.18.2:它会按新旧两个名字匹配每条规则,一份文件两边都管用。
### 支持的 AI 平台
| 平台 | 状态 | 配置文件 | AI 模型 |
|------|------|---------|---------|
| **Claude Code** | ✅ 原生技能 | `skills/vmware-aiops/SKILL.md` | Anthropic Claude |
| **Gemini CLI** | ✅ 上下文文件 + MCP | `skills/vmware-aiops/SKILL.md` | Google Gemini |
| **OpenAI Codex CLI** | ✅ AGENTS.md | `skills/vmware-aiops/SKILL.md` | OpenAI GPT |
| **Aider** | ✅ 约定文件 | `skills/vmware-aiops/SKILL.md` | 任意(云端 + 本地) |
| **Continue CLI** | ✅ 规则文件 | `skills/vmware-aiops/SKILL.md` | 任意(云端 + 本地) |
| **Trae IDE** | ✅ Rules | `skills/vmware-aiops/SKILL.md` | Claude/DeepSeek/GPT-4o/Doubao |
| **Kimi Code CLI** | ✅ Skill | `skills/vmware-aiops/SKILL.md` | Moonshot Kimi |
| **MCP Server** | ✅ MCP 协议 | `vmware_aiops/mcp_server/` | 任意 MCP 客户端 |
| **Python CLI** | ✅ 独立运行 | N/A | N/A |
#### MCP Server 集成(本地 Agent)
vmware-aiops MCP Server 可接入**任何 MCP 兼容的 Agent 或工具**。配置模板见 [`examples/mcp-configs/`](examples/mcp-configs/)。
| Agent / 工具 | 本地模型支持 | 配置模板 | 集成指南 |
|-------------|:----------:|---------|---------|
| **[Goose](https://github.com/block/goose)** | ✅ Ollama, LM Studio | [`goose.json`](examples/mcp-configs/goose.json) | [指南](docs/integrations/goose.md) |
| **[LocalCowork](https://github.com/Liquid4All/localcowork)** | ✅ 完全离线 | [`localcowork.json`](examples/mcp-configs/localcowork.json) | [指南](docs/integrations/localcowork.md) |
| **[mcp-agent](https://github.com/lastmile-ai/mcp-agent)** | ✅ Ollama, vLLM | [`mcp-agent.yaml`](examples/mcp-configs/mcp-agent.yaml) | [指南](docs/integrations/mcp-agent.md) |
| **VS Code Copilot** | — | [`vscode-copilot.json`](examples/mcp-configs/vscode-copilot.json) | [指南](docs/integrations/vscode-copilot.md) |
| **Cursor** | — | [`cursor.json`](examples/mcp-configs/cursor.json) | — |
| **Continue** | ✅ Ollama | [`continue.yaml`](examples/mcp-configs/continue.yaml) | [指南](docs/integrations/continue.md) |
| **Claude Code** | — | [`claude-code.json`](examples/mcp-configs/claude-code.json) | — |
**完全本地运行**(无需云端 API):
```bash
# Aider + Ollama + vmware-aiops(通过 SKILL.md)
aider --conventions skills/vmware-aiops/SKILL.md --model ollama/qwen2.5-coder:32b
```
---
### 国内云端模型
| 模型 | 说明 | 配合工具 |
|------|------|---------|
| DeepSeek | 性价比高,编程能力强 | Aider / Continue |
| 通义千问 Qwen | 阿里云,有免费额度 | Aider / Continue |
| 豆包 Doubao | 字节跳动 | Aider / Trae IDE |
```bash
# DeepSeek
export DEEPSEEK_API_KEY="your-key"
aider --conventions skills/vmware-aiops/SKILL.md --model deepseek/deepseek-coder
# 通义千问
export DASHSCOPE_API_KEY="your-key"
aider --conventions skills/vmware-aiops/SKILL.md --model qwen/qwen-coder-plus
```
---
### 本地模型(Aider + Ollama)
完全离线运行,无需云端 API,完全隐私:
```bash
brew install ollama # macOS
ollama pull qwen2.5-coder:32b # 下载模型(~20GB)
ollama serve # 启动服务
aider --conventions skills/vmware-aiops/SKILL.md --model ollama/qwen2.5-coder:32b
```
---
### 项目结构
```
VMware-AIops/
├── skills/ # Skills 索引(npx skills add)
│ └── vmware-aiops/
│ ├── SKILL.md # 精简版技能(渐进式展开)
│ └── references/ # 按需加载的详细文档
│ ├── capabilities.md # 完整功能表格
│ ├── cli-reference.md # 完整 CLI 参考
│ └── setup-guide.md # 安装、安全、AI 平台
├── vmware_aiops/ # Python 后端
│ ├── config.py # 配置管理
│ ├── connection.py # 多目标连接(pyVmomi)
│ ├── cli/ # Typer CLI(双重确认)
│ ├── ops/ # 运维操作
│ │ ├── inventory.py # VM、主机、数据存储、集群
│ │ ├── health.py # 告警、事件、传感器
│ │ ├── vm_lifecycle.py # VM 生命周期管理
│ │ ├── vm_deploy.py # OVA、模板、链接克隆、批量部署
│ │ └── datastore_browser.py # 数据存储浏览、镜像发现
│ ├── scanner/ # 日志扫描守护进程
│ ├── notify/ # 通知(JSONL + Webhook)
│ └── mcp_server/ # MCP 服务器
│ ├── server.py # MCP 工具定义
│ └── __main__.py # 入口
├── examples/mcp-configs/ # MCP 客户端配置模板
├── tests/ # 测试
├── smithery.yaml # Smithery 市场配置
├── config.example.yaml
└── pyproject.toml
```
## 许可证
MIT
### VM 扩缩容限额
Policy 1.25.0 及以上版本支持 `~/.vmware/rules.yaml` 中的
`change_limits.max_cpu_change_pct` 和 `max_memory_change_pct`,按 VM 当前配置
约束增减的绝对百分比。事实来自后端最终解析的 VM,调用方不能靠声明较小
百分比绕过。缺少必要状态或版本、限额配置无效时不提交任务。ConfigSpec 的
`changeVersion` 防止并发配置变化使比较基数失效。该限制适用于配置调整(包括部署后的扩缩容),
初始创建/克隆任务不受此百分比检查约束;未配置限额时保持原行为。已有合成拒绝及版本绑定测试,
并发拒绝的正向真机验证仍待补。
通过同一后端进行的部署后扩缩容仍会检查限额。拒绝时,新建 VM 可能已经存在,
且保持原始规格;重试前应先查看结果。最初的创建/克隆任务本身不执行百分比
限额检查,本轮不引入自动删除或重复克隆。