VMware admins rely on PowerCLI, esxcli one-liners, and Python scripts for daily tasks like health checks, VM migrations, and storage monitoring to save hours of manual work.
Daily Health Check Script (PowerCLI)
Purpose: Run every morning to spot issues across cluster, hosts, VMs, and datastores.
powershell# VMware Daily Health Check - Save as HealthCheck.ps1
Connect-VIServer vcenter.example.com
$Report = @()
$Clusters = Get-Cluster
foreach ($Cluster in $Clusters) {
$Hosts = Get-VMHost -Location $Cluster
$Report += [PSCustomObject]@{
Cluster = $Cluster.Name
HostsDown = ($Hosts | Where {$_.State -ne 'Connected'}).Count
VMsDown = (Get-VM -Location $Hosts | Where {$_.PowerState -ne 'PoweredOn'}).Count
DatastoresFull = (Get-Datastore -Location $Hosts | Where {$_.FreeSpaceGB/($_.CapacityGB)*100 -lt 20}).Count
HighCPUHosts = ($Hosts | Where {$_.CpuUsageMhz -gt 80}).Count
}
}
$Report | Export-Csv "DailyHealth-$(Get-Date -f yyyy-MM-dd).csv" -NoTypeInformation
Send-MailMessage -To admin@company.com -Subject "VMware Health Report" -Body "Check attached CSV" -Attachments "DailyHealth-$(Get-Date -f yyyy-MM-dd).csv"
Schedule: Windows Task Scheduler daily 8AM, outputs CSV + email summary.
Host Reboot & Maintenance Script
Purpose: Graceful host maintenance with VM evacuation.
powershell# HostMaintenance.ps1
param($HostName, $MaintenanceReason)
$HostObj = Get-VMHost $HostName
if ((Get-VM -Location $HostObj).Count -gt 0) {
Move-VM -VM (Get-VM -Location $HostObj) -Destination (Get-Cluster -VMHost $HostObj | Get-VMHost | Where {$_.State -eq 'Connected'} | Select -First 1)
}
Set-VMHost $HostName -State Maintenance -Confirm:$false
Restart-VMHost $HostName -Confirm:$false -Reason $MaintenanceReason
Usage: ./HostMaintenance.ps1 esxi-01 "Patching"
Storage Rescan & Connectivity Script (ESXi SSH)
Purpose: Fix “LUNs not visible” after SAN changes – run on all hosts.
bash#!/bin/bash
# storage-rescan.sh - Run via SSH or Ansible
for adapter in $(esxcli storage core adapter list | grep -E 'vmhba[0-9]+' | awk '{print $1}'); do
esxcli storage core adapter rescan -A $adapter
done
esxcli storage filesystem list | grep -E 'Mounted|Accessible'
vmkping -I vmk1 $(esxcli iscsi adapter discovery sendtarget list | awk '{print $7}' | tail -1)
echo "Storage rescan complete on $(hostname)"
Cron: */30 * * * * /scripts/storage-rescan.sh >> /var/log/storage-rescan.log
VM Snapshot Cleanup Script
Purpose: Auto-delete snapshots >7 days old to prevent datastore exhaustion.
powershell# SnapshotCleanup.ps1
$OldSnapshots = Get-VM | Get-Snapshot | Where {$_.CreateTime -lt (Get-Date).AddDays(-7)}
foreach ($Snap in $OldSnapshots) {
Remove-Snapshot $Snap -Confirm:$false -RunAsync
Write-Output "Deleted snapshot $($Snap.Name) on $($Snap.VM.Name)"
}
Alert on large snaps: Add Where {$_.SizeGB -gt 10} filter.
iSCSI Path Failover Test Script
Purpose: Verify multipath redundancy before maintenance.
bash#!/bin/bash
# iscsi-path-test.sh
echo "=== iSCSI Path Status ==="
esxcli iscsi session list
echo "=== Active Paths ==="
esxcli storage core path list | grep -E 'working|dead'
echo "=== LUN Paths ==="
esxcli storage nmp device list | grep -E 'path'
Run weekly: Documents path count for compliance audits.
NFS Mount Verification Script
Purpose: Check all NFS datastores connectivity.
bash#!/bin/bash
# nfs-check.sh
for datastore in $(esxcli storage filesystem list | grep nfs | awk '{print $1}'); do
mount | grep $datastore || echo "NFS $datastore NOT mounted!"
vmkping -c 3 -I vmk0 $(esxcli storage filesystem list | grep $datastore | awk '{print $4}')
done
Performance Monitoring Script (esxtop Capture)
Purpose: Collect 5min esxtop data during issues.
bash#!/bin/bash
# perf-capture.sh
esxtop -b -a -d 300 > /tmp/esxtop-$(date +%Y%m%d-%H%M%S).csv
echo "Captured $(ls -lh /tmp/esxtop-*.csv | wc -l) perf files"
Analyze: esxtop replay or Excel pivot on %LATENCY, DAVG.
One-Liner Toolkit
Deployment Guide
- PowerCLI Setup:
Install-Module VMware.PowerCLIon jumpbox. - ESXi Scripts: SCP to
/scripts/,chmod +x, add to crontab. - Confluence Integration: Embed scripts as
<pre>blocks, add “Copy” buttons. - Alerting: Pipe outputs to Slack/Teams via webhook or email.
- Version Control: Git repo per datacenter, tag releases.