vmware-storage ยท diff

git:20260916.196bd39 to git:20260918.1cb56ce

27 added, 8 removed. Audit A to A.

---
name: vmware-storage
description: >
Use this skill whenever the user needs to manage VMware storage โ€” datastores, iSCSI targets, and vSAN clusters.
- Directly handles: browse datastores, scan for deployable images (OVA/ISO), configure iSCSI adapters and targets, check vSAN health and capacity.
- Always use this skill for "list datastores", "add iSCSI target", "check vSAN health", "browse datastore files", "scan for OVA images", or any storage-related VMware task.
+ Directly handles: browse datastores, scan for deployable images (OVA/ISO), configure iSCSI adapters and targets, check vSAN health and capacity, read-only Fibre Channel HBA/WWPN inventory and multipath path state.
+ Always use this skill for "list datastores", "add iSCSI target", "check vSAN health", "browse datastore files", "scan for OVA images", "dead paths", "FC HBA WWPN", or any storage-related VMware task.
Do NOT use for VM lifecycle operations (use vmware-aiops), NSX networking (use vmware-nsx), or Kubernetes clusters (use vmware-vks).
For load balancing/AVI/AKO use vmware-avi.
installer:
kind: uv
package: vmware-storage
allowed-tools:
- Bash
metadata: {"openclaw":{"requires":{"anyBins":["vmware-storage","uvx"]},"optional":{"env":["VMWARE_STORAGE_CONFIG","VMWARE_<TARGET>_PASSWORD","VMWARE_<TARGET>_USERNAME","VMWARE_AUDIT_APPROVED_BY"],"bins":["vmware-policy"]},"homepage":"https://github.com/vmware-skills/VMware-Storage","emoji":"๐Ÿ—„๏ธ","os":["macos","linux"]}}
compatibility: >
vmware-policy auto-installed as Python dependency (provides @vmware_tool decorator and audit logging). All write operations audited to ~/.vmware/audit.db.
Credentials: Each vCenter/ESXi target requires a per-target password env var in ~/.vmware-storage/.env following the pattern VMWARE_<TARGET_NAME_UPPER>_PASSWORD (e.g., target "my-vcenter" โ†’ VMWARE_MY_VCENTER_PASSWORD). No webhooks or outbound network calls โ€” this skill is local-only (stdio MCP + vSphere API). Audit logs written to ~/.vmware/audit.db (SQLite WAL, local only).
---
# VMware Storage
> **Disclaimer**: This is a community-maintained open-source project and is **not affiliated with, endorsed by, or sponsored by VMware, Inc. or Broadcom Inc.** "VMware" and "vSphere" are trademarks of Broadcom. Source code is publicly auditable at [github.com/vmware-skills/VMware-Storage](https://github.com/vmware-skills/VMware-Storage) under the MIT license.
- VMware vSphere storage management โ€” 12 MCP tools for datastores, iSCSI, and vSAN.
+ VMware vSphere storage management โ€” 14 MCP tools for datastores, iSCSI, vSAN, and Fibre Channel / multipath diagnostics.
> Split from vmware-aiops for lighter context and local model compatibility.
> **Companion skills**: [vmware-aiops](https://github.com/vmware-skills/VMware-AIops) (VM lifecycle), [vmware-monitor](https://github.com/vmware-skills/VMware-Monitor) (read-only monitoring), [vmware-vks](https://github.com/vmware-skills/VMware-VKS) (Tanzu Kubernetes), [vmware-nsx](https://github.com/vmware-skills/VMware-NSX) (NSX networking), [vmware-nsx-security](https://github.com/vmware-skills/VMware-NSX-Security) (DFW/firewall), [vmware-aria](https://github.com/vmware-skills/VMware-Aria) (metrics/alerts/capacity), [vmware-avi](https://github.com/vmware-skills/VMware-AVI) (AVI/ALB/AKO), [vmware-harden](https://github.com/vmware-skills/VMware-Harden) (compliance baselines).
> | [vmware-pilot](../vmware-pilot/SKILL.md) (workflow orchestration) | [vmware-policy](../vmware-policy/SKILL.md) (audit/policy)
## What This Skill Does
| Category | Tools | Count |
|----------|-------|:-----:|
| **Datastore** | list all datastores, browse files, scan for OVA/ISO/OVF/VMDK images, list cached images | 4 |
| **iSCSI** | enable adapter, show status, add target, remove target, rescan HBAs | 5 |
| **vSAN** | cluster health summary, capacity overview (total/used/free), data-efficiency (dedup/compression) | 3 |
+ | **FC / multipath** (read-only) | FC HBA inventory with WWPN/WWNN; per-device path state across hosts, datastore backing devices, path-count differences across hosts | 2 |
## Quick Install
```bash
- uv tool install vmware-storage==1.9.3
+ uv tool install vmware-storage==1.10.0
vmware-storage init # guided setup: writes config + .env (chmod 600, password grep-safe), then verifies
vmware-storage doctor
```
## When to Use This Skill
- Browse datastore files or scan for deployable images (OVA/ISO/VMDK)
- Configure iSCSI: enable adapter, add/remove send targets, rescan storage
- Check vSAN cluster health and capacity
+ - Fibre Channel: list HBAs and WWPNs, find dead/disabled paths, compare path counts across a cluster, map a datastore to its devices
- Any storage-focused VMware operation
**Use companion skills for**:
- VM lifecycle, deployment, guest ops โ†’ `vmware-aiops`
- Inventory, health, alarms, events โ†’ `vmware-monitor`
- Tanzu Kubernetes โ†’ `vmware-vks`
- Load balancing, AVI/ALB, AKO, Ingress โ†’ `vmware-avi`
## Related Skills โ€” Skill Routing
| User Intent | Recommended Skill |
|-------------|-------------------|
| Read-only monitoring, alarms, events | **vmware-monitor** |
| Storage: iSCSI, vSAN, datastores | **vmware-storage** โ† this skill |
| VM lifecycle, deployment, guest ops | **vmware-aiops** |
| Tanzu Kubernetes (vSphere 8.x+) | **vmware-vks** |
| NSX networking: segments, gateways, NAT | **vmware-nsx** |
| NSX security: DFW rules, security groups | **vmware-nsx-security** |
| Aria Ops: metrics, alerts, capacity planning | **vmware-aria** |
| Multi-step workflows with approval | **vmware-pilot** |
| Compliance baselines (CIS / ็ญ‰ไฟ / PCI-DSS), drift detection, LLM remediation advisor | **vmware-harden** (`uv tool install vmware-harden`) |
| Load balancer, AVI, ALB, AKO, Ingress | **vmware-avi** (`uv tool install vmware-avi`) |
| Audit log query | **vmware-policy** (`vmware-audit` CLI) |
## Common Workflows
### Set Up iSCSI Storage on a Host
**Pre-flight (judgment)**:
- Network reachability: `vmkping <iscsi-target-ip>` from the ESXi host must succeed BEFORE adding the target. Adding an unreachable target leaves the host in a degraded state, retrying forever.
- Adapter sanity: `iscsi status` first โ€” if already enabled, do not "re-enable"; just add the target.
- Idempotency: `add-target` is idempotent (re-adding same IP is a no-op), but `remove-target` is not safely reversible mid-IO. Always verify no LUNs from this target are in use before removing.
- Existing targets: list them first; some sites add targets one-per-host while others use cluster-wide. Check site convention.
**Steps**:
1. `iscsi status esxi-01` โ†’ confirm adapter state and existing targets
2. `iscsi enable esxi-01 --dry-run` then real (skip if already enabled)
3. `iscsi add-target esxi-01 <ip> --dry-run` then real (auto-rescans on success)
4. `iscsi status esxi-01` again โ†’ confirm target listed AND devices appearing
5. If devices missing 30+ sec after add: `iscsi rescan esxi-01` once more, then check ESXi-side `vmkping` and target ACL
### Find Deployable Images Across Datastores
**Judgment**: image search is read-only and safe, but blind scanning of every datastore is slow on large estates. Filter first.
1. `datastore list` โ†’ get the inventory; ignore datastores marked `inaccessible` or low free space
2. `datastore scan-images <ds>` on the datastore most likely to hold images (typically named `iso-*`, `templates`, or central `nfs-shared`)
3. If unsure where images live: scan multiple in parallel via separate calls; results are cached in the local registry
4. `datastore browse <ds> --pattern "*.iso"` for ad-hoc searches; pattern is glob, not regex
5. **If datastore not found**: name is case-sensitive. `datastore list --target <vc>` to verify exact spelling.
For filtered queries against the cache: use `list_cached_images` MCP tool with `image_type` and `datastore` parameters โ€” avoids re-scanning.
### vSAN Health Assessment
**Judgment**: vSAN problems often masquerade as vSphere problems and vice-versa. Check both planes โ€” if vSAN is healthy but VMs are slow, the issue is at the compute or network layer, not storage.
1. `vsan health <cluster>` โ†’ look beyond green/red โ€” check disk group state, network partitioning, and cluster member counts. A "yellow" disk group is the early warning of a failure.
2. `vsan capacity <cluster>` โ†’ utilization > 70% triggers slack-space risk; > 80% impedes resync; never let prod cross 80%.
3. Cross-check `vmware-monitor health alarms` for vSAN-related alarms (HCL warnings, network anomalies)
4. **If vSAN not enabled** on this cluster: check cluster type via `vmware-monitor inventory clusters`; vSAN is opt-in, not default
5. For deep investigation, follow [`references/investigation-protocol.md`](../vmware-aria/skills/vmware-aria/references/investigation-protocol.md) (in companion skill) โ€” vSAN issues frequently fail the Mechanism criterion (capacity is correlated, not causal)
+ ### Check Fibre Channel Paths
+
+ **Judgment**: report what vSphere observed, not a verdict. `standby` paths are normal on active/passive arrays, and equal path counts do not prove two independent fabrics. Zoning, array masking and switch health are out of scope.
+
+ 1. `paths devices --datastore <ds>` โ†’ dead/disabled paths behind one datastore, per host (devices needing attention sort first)
+ 2. `paths devices --cluster <c> --only-differences` โ†’ shared devices some hosts do not see, or see through a different number of paths; each host's `paths_total` shows which has fewer
+ 3. `paths devices --host <h> --adapter vmhba2` โ†’ what depends on one HBA; `only_paths_via_adapter: true` means that host has no other path to the device
+ 4. `paths fc-adapters --cluster <c>` โ†’ WWPNs to hand to the SAN team
+ 5. **If `complete` is false**: hosts in `hosts_not_read` were not read (the reason says `NoPermission` or the connection state). Name them as unknown โ€” never report them as missing the device
+ 6. **If "Scope required"**: pass exactly one of `--cluster`, `--host` or `--datastore`; this tool does not read every host at once
+
### Multi-Target Operations
All commands accept `--target <name>` to operate against a specific vCenter or ESXi host from your config:
```bash
# Default target (first in config.yaml)
vmware-storage datastore list
# Specific target
vmware-storage datastore list --target prod-vcenter
vmware-storage iscsi status esxi-lab --target lab-esxi
```
## Usage Mode
| Scenario | Recommended | Why |
|----------|:-----------:|-----|
| Local/small models (Ollama, Qwen) | **CLI** | ~2K tokens vs ~8K for MCP |
| Cloud models (Claude, GPT-4o) | Either | MCP gives structured JSON I/O |
| Automated pipelines | **MCP** | Type-safe parameters, structured output |
- ## MCP Tools (12 โ€” 8 read, 4 write)
+ ## MCP Tools (14 โ€” 10 read, 4 write)
All MCP tools accept an optional `target` parameter to select which vCenter/ESXi to connect to. The 4 write tools also accept `dry_run: true` to preview the change without executing it.
The four Datastore read tools return the family list envelope โ€” `{items, returned, limit, total, truncated, hint}` โ€” rather than a bare array. Read the rows from `items`; `truncated` says whether the listing is complete, so it never has to be guessed from the row count. All four enumerate their collection in full, so `total` is the real count and `truncated` is always `false`.
| Category | Tool | Type | Description |
|----------|------|:----:|-------------|
| Datastore | `list_all_datastores` | Read | List datastores with capacity, usage %, VM count |
| | `browse_datastore` | Read | Browse files with optional path and glob pattern |
| | `scan_datastore_images` | Read | Find OVA/ISO/OVF/VMDK in a datastore |
| | `list_cached_images` | Read | Query local image registry with type/datastore filters |
| iSCSI | `storage_iscsi_status` | Read | Show adapter status, HBA device, IQN, send targets |
| | `storage_iscsi_enable` | Write | Enable software iSCSI adapter on a host |
| | `storage_iscsi_add_target` | Write | Add iSCSI send target (IP + port) and rescan |
| | `storage_iscsi_remove_target` | Write | Remove iSCSI send target and rescan |
| | `storage_rescan` | Write | Rescan all HBAs and VMFS volumes |
| vSAN | `vsan_health` | Read | Cluster health summary and disk group details |
| | `vsan_capacity` | Read | Total/used/free capacity in GB and usage % |
| | `vsan_efficiency` | Read | Dedup + compression status (vSAN Management SDK) |
+ | FC / multipath | `fc_adapter_list` | Read | FC/FCoE HBAs per host: WWPN/WWNN, port type, status, reported speed |
+ | | `storage_device_paths` | Read | Per-device path state across a cluster/host/datastore; visibility and path-count differences |
- **Read/write split**: 8 tools are read-only, 4 modify state. Write tools require explicit parameters (host name, IP address), support `dry_run`, and are audit-logged. `storage_iscsi_remove_target` is classified `risk:high` (destructive โ€” LUNs can become inaccessible) and goes through the policy confirmation gate.
+ **Read/write split**: 10 tools are read-only, 4 modify state. Write tools require explicit parameters (host name, IP address), support `dry_run`, and are audit-logged. `storage_iscsi_remove_target` is classified `risk:high` (destructive โ€” LUNs can become inaccessible) and goes through the policy confirmation gate.
Running with local or small models? See [`references/agent-guardrails.md`](references/agent-guardrails.md).
## CLI Quick Reference
```bash
# Datastore
vmware-storage datastore list [--target <name>]
vmware-storage datastore browse <ds_name> [--path <subdir>] [--pattern "*.ova"]
vmware-storage datastore scan-images <ds_name> [--target <name>]
# iSCSI
vmware-storage iscsi enable <host> [--dry-run]
vmware-storage iscsi status <host>
vmware-storage iscsi add-target <host> <ip> [--port 3260] [--dry-run]
vmware-storage iscsi remove-target <host> <ip> [--port 3260] [--dry-run]
vmware-storage iscsi rescan <host> [--dry-run]
# vSAN
vmware-storage vsan health <cluster> [--target <name>]
vmware-storage vsan capacity <cluster> [--target <name>]
+ # Fibre Channel / multipath (read-only)
+ vmware-storage paths fc-adapters [--cluster <c> | --host <h>]
+ vmware-storage paths devices (--cluster <c> | --host <h> | --datastore <ds>) [--device <naa>] [--adapter <vmhba>] [--only-differences]
+
# Diagnostics
vmware-storage doctor [--skip-auth]
```
> Full CLI reference with all options and output formats: see `references/cli-reference.md`
## Troubleshooting
### iSCSI enable fails with "already enabled"
Not an error. The software iSCSI adapter is already active on that host. The response includes the current HBA device name and IQN. Run `iscsi status` to see configured send targets.
### "Datastore not found" when browsing
Datastore names are **case-sensitive**. Run `vmware-storage datastore list` to get the exact name. Common mistakes: `Datastore1` vs `datastore1`, trailing spaces.
### `vsan_health` returns `overall_health: null`
`null` means the health service was **not asked**, and `health_not_queried_reason` says why. It is deliberately not the string `"unknown"` โ€” vSAN returns that itself, so using it for "we did not ask" made the two impossible to tell apart (on one VCF 9.1 cluster it stood in for `red`). A string in `overall_health` is always vSAN's own answer.
The usual cause is a **standalone ESXi** target: `VsanVcClusterHealthSystem` runs in vCenter's vSAN Health Service, so connect to the vCenter that manages the cluster. Otherwise read it in the vCenter UI under Cluster > Monitor > vSAN > Skyline Health.
`health_checked_at` is the age of vCenter's cached summary. This tool reads that cache โ€” the same one Skyline Health shows โ€” rather than triggering a full health run, which takes minutes and loads the cluster.
### Rescan doesn't discover new LUNs
After adding iSCSI targets, the storage subsystem may need 10-30 seconds to enumerate new LUNs. Steps to resolve:
1. Verify the target IP is reachable from the ESXi host (`vmkping` from ESXi shell)
2. Check that the iSCSI target is correctly configured: `vmware-storage iscsi status <host>`
3. Wait 15-30 seconds, then rescan again: `vmware-storage iscsi rescan <host>`
### "Password not found" error
The password environment variable is missing. Variable names follow the pattern `VMWARE_<TARGET_NAME_UPPER>_PASSWORD` where hyphens become underscores. Example: target `my-vcenter` needs `VMWARE_MY_VCENTER_PASSWORD`. Check your `~/.vmware-storage/.env` file.
### Doctor reports ".env permissions too open"
The `.env` file contains passwords and must have owner-only permissions:
```bash
chmod 600 ~/.vmware-storage/.env
```
### Connection timeout to vCenter
The `doctor` command tests connectivity with a 5-second TCP timeout. If your vCenter is on a high-latency network, the check may fail even though the connection works. Use `--skip-auth` to bypass both connectivity and auth checks, then test manually.
### `invalid peer certificate: UnknownIssuer` when starting MCP via uvx
Corporate TLS proxies inject certificates that uv's bundled CA store doesn't trust. Use the recommended `vmware-storage mcp` form (no PyPI re-resolve), or set `export UV_NATIVE_TLS=true` to make uv use system CAs.
## Safety
- **No VM operations**: This skill cannot power on/off, create, delete, or modify VMs โ€” that scope belongs to `vmware-aiops`
- - **Read-heavy**: 8 of 12 tools are read-only (list, browse, scan, cached images, status, health, capacity, efficiency)
+ - **Read-heavy**: 10 of 14 tools are read-only (list, browse, scan, cached images, status, health, capacity, efficiency, FC adapters, device paths)
- **Audit logging**: All operations (including reads) are logged to `~/.vmware/audit.db` (SQLite WAL, via vmware-policy) with timestamp, user, target, operation, parameters, and result
- **Double confirmation**: CLI write commands (iSCSI enable, add/remove target) require two separate "Are you sure?" prompts before executing
- **Dry-run mode**: All write commands support `--dry-run` to preview API calls without executing
- **Input validation**: IP addresses validated via `ipaddress.ip_address()`, ports checked for 1-65535 range, host/cluster/datastore names looked up before operations
- **Prompt injection defense**: Datastore file names and paths from vSphere are sanitized via `_sanitize()` โ€” strips control characters (C0/C1), truncates to 500 chars โ€” preventing malicious file names from injecting instructions into downstream LLM agents
- **Credential safety**: Passwords loaded only from environment variables (`.env` file), never from `config.yaml`; `.env` permissions are checked at startup
- **L5 auto-remediation patterns (PoC)**: The [`patterns/`](../../patterns/) directory hosts L5 auto-remediation **candidate** patterns under the Enterprise Harness Engineering framework. First PoC: [`patterns/iscsi-target-stale-rescan.yaml`](../../patterns/iscsi-target-stale-rescan.yaml) โ€” iSCSI HBA rescan classified as `risk:low` + `reversible:true` + `repeatable:true`. Schema only; **not yet enforced by the runtime**. See `references/capabilities.md` ยง Automation Level Reference for the full L1โ€“L5 table.
> Full security details: see `references/setup-guide.md`
## Setup
```bash
- uv tool install vmware-storage==1.9.3
+ uv tool install vmware-storage==1.10.0
mkdir -p ~/.vmware-storage
cp config.example.yaml ~/.vmware-storage/config.yaml
# Edit config.yaml with your vCenter/ESXi targets
# Add to ~/.vmware-storage/.env (create if missing, chmod 600):
# VMWARE_MY_VCENTER_PASSWORD=<your-password>
chmod 600 ~/.vmware-storage/.env
vmware-storage doctor
```
> All tools are automatically audited via vmware-policy. Audit logs: `vmware-audit log --last 20`
> Full setup guide with multi-target config, MCP server setup, and Docker: see `references/setup-guide.md`
## Architecture
```
User (natural language)
โ†“
AI Agent (Claude Code / Goose / Cursor)
โ†“ reads SKILL.md
vmware-storage CLI or MCP server (stdio transport)
โ†“ pyVmomi (vSphere SOAP API)
vCenter Server / ESXi
โ†“
Datastores / iSCSI / vSAN
```
The MCP server uses stdio transport (local only, no network listener). Connections to vSphere use SSL/TLS on port 443.
## Audit & Safety
All operations are automatically audited via vmware-policy (`@vmware_tool` decorator):
- Every tool call logged to `~/.vmware/audit.db` (SQLite, framework-agnostic)
- Policy rules enforced via `~/.vmware/rules.yaml` (deny rules, maintenance windows, risk levels)
- Risk classification: each tool tagged as low/medium/high/critical
- View recent operations: `vmware-audit log --last 20`
- View denied operations: `vmware-audit log --status denied`
vmware-policy is automatically installed as a dependency โ€” no manual setup needed.
## License
MIT โ€” [github.com/vmware-skills/VMware-Storage](https://github.com/vmware-skills/VMware-Storage)