# VMware AIops [![PyPI](https://img.shields.io/pypi/v/vmware-aiops)](https://pypi.org/project/vmware-aiops/) [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](#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 可能已经存在, 且保持原始规格;重试前应先查看结果。最初的创建/克隆任务本身不执行百分比 限额检查,本轮不引入自动删除或重复克隆。