Infrastructure · Security · Engineering Tell us what you need

Home / Apache CloudStack / Health audit guide

Open resource · no signup

Audit your CloudStack
environment.

A seven-area health audit you can run yourself. Each area gives you the API call, a prompt to analyse the output, the improvements to make, and a re-check that has to come back empty before the issue counts as closed.

Version
1.0
Last reviewed
August 2026
Applies to
CloudStack 4.18 and above
Time to run
Half a day, first pass
API verified against
4.22.0.0 reference

Before you start

Before you run anything

This guide is general information about how we approach a CloudStack audit. It is not advice for your specific environment. Every command is intended to be read-only and we have written them that way deliberately, but you are running them on your own systems at your own discretion — read each one and understand it before you do. Thresholds and worked figures are illustrative. MDCS accepts no liability for decisions taken on the basis of this guide.

Two rules before you paste anything into a chat window

Use a read-only account. This is an inspection, not a change. Create a restricted role with list permissions rather than using an admin key — the same principle we would flag in an access review of your estate.

Sanitise the output. API responses carry hostnames, public IP ranges, capacity figures and topology. Strip them, or export redacted, before pasting into any third-party service. Treat that output the way you would treat a network diagram.

You will need the management server URL, an API key and secret for a read-only account, and a way to call the API.

Use cmk, not the old cloudmonkey

The current CloudMonkey is cmk — a Go rewrite, shipped as a single binary, compatible with CloudStack 4.9 and above. The original Python cloudmonkey is no longer maintained. Commands below use cmk. Both the noun form (list hosts) and the direct API form (listHostsMetrics) work. Install and verification steps are in the next section.

Create the read-only account with a restricted role — CloudStack supports custom roles through createRole and role permissions, so a list-only role is a few minutes of work and it is the right way to run an inspection.

On the AI assistant

The prompts below were written against Claude, so that is what the worked examples show. The method is not tied to it — any model capable of reading structured JSON and reasoning about it will do. Substitute freely.

Install and verify cmk

Five minutes, and worth doing properly. You are about to point this tool at production infrastructure, so treat the download the way you would treat any other binary entering your estate.

1 — Import the Apache signing keys

wget https://dlcdn.apache.org/cloudstack/KEYS gpg --import KEYS

2 — Verify the release you downloaded

# signature gpg --verify apache-cloudstack-cloudmonkey-6.5.0-src.tar.bz2.asc \ apache-cloudstack-cloudmonkey-6.5.0-src.tar.bz2 # checksum sha512sum --check apache-cloudstack-cloudmonkey-6.5.0-src.tar.bz2.sha512

sha512sum should print OK. A "Good signature" warning that the key is not certified with a trusted signature is normal — it means you have not personally signed the release manager's key. A BAD signature, or a failed checksum, is not normal. Stop there.

CloudMonkey's current release is 6.5.0. Take KEYS and the signature files from the Apache distribution directory rather than from a mirror.

Know what you are actually downloading

Apache publishes the source release with PGP and SHA512 signatures. The ready-to-run binaries on the GitHub releases page are published by community members as a convenience — they are not part of the signed Apache release.

For most teams the GitHub binary is fine. If your organisation requires verified provenance for anything running against production, build from the signed source instead. Decide which applies to you before you download, not after.

3 — Install the binary

sudo mv cmk.linux.x86-64 /usr/local/bin/cmk sudo chmod +x /usr/local/bin/cmk cmk -v

cmk -v should print the CloudMonkey version and build hash. If the shell cannot find cmk, /usr/local/bin is not on your PATH.

4 — Configure a profile

cmk set profile audit cmk set url https://<management-server>/client/api cmk set apikey <read-only-api-key> cmk set secretkey <read-only-secret-key> cmk set output json cmk set verifycert true

Config lives at ~/.cmk/config in plain text, including the secret key. Keep it 0600, keep it off shared machines, and remove the profile when the audit is finished. Leave verifycert true — turning it off to get past a certificate warning is how you end up trusting the wrong endpoint.

5 — Prove the connection works

cmk -p audit list zones

6 — Prove the account is actually read-only

# listApis returns only the APIs this account is permitted to call cmk -p audit list apis | grep -Ei '"name": "(create|delete|update|destroy|expunge|stop|reboot)'

This should return nothing. If create, delete or destroy APIs appear, the role is not restricted the way you think it is — fix the role before continuing. Verifying the restriction rather than assuming it is the same discipline as re-checking a finding rather than trusting that the fix worked.

The method

PHASE 1

Check

Run the API call. Paste the output with the prompt. The assistant identifies what is wrong.

PHASE 2

Improve

Work through each issue with the remediation guidance, and ask follow-up questions where the fix is not obvious.

PHASE 3

Re-check

Re-run the same call. The re-check must return empty. If it does not, the issue reopens.

That last phase is the one that proves anything. An issue is not closed because somebody applied a fix — it is closed because the query that found it no longer returns it.

The metrics APIs do half the work for you

Alongside the plain list calls, CloudStack exposes listHostsMetrics, listStoragePoolsMetrics, listVolumesMetrics, listClustersMetrics, listZonesMetrics and listInfrastructure. These return computed utilisation rather than raw records, so the analysis has less to infer and you have less to paste. Start with listInfrastructure for a one-call overview of the estate before working through the areas.

Set the context once

Paste this at the start of the conversation, before any API output. It saves repeating the environment details on every area, and it stops the assistant inventing severity levels that mean nothing to you.

You are helping me audit an Apache CloudStack environment. I am the infrastructure lead, not a developer. Environment: [version, number of zones, hypervisor type, storage backend]. For every batch of API output I give you: 1. List only real problems. Do not restate what is healthy. 2. Rank each finding Critical, Warning or Info, and say what the actual consequence is if it is left alone. 3. Give the remediation as specific steps for CloudStack, not general advice. 4. Tell me the exact API call that will prove the issue is fixed. 5. If the output does not contain enough information to judge something, say so rather than guessing. Acknowledge and wait for the first output.

Why point 5 matters

Without it you will get confident answers about things the API response never contained. Asking for the gap to be named is the difference between an analysis you can act on and one you have to verify by hand.

01

Zones, pods & clusters

What to check

All zones enabled, pods holding valid non-overlapping IP ranges, clusters connected and out of error state.

Run

cmk list zones showcapacities=true cmk list pods cmk list clusters

Prompt

Here is the output of my CloudStack listZones, listPods and listClusters calls. Identify anything not in Enabled state, flag missing or overlapping pod IP ranges, and list every error.

Improvements

  • Enable disabled zones and pods, with the reason documented
  • Correct overlapping or missing pod IP ranges
  • Remove stale cluster entries that no longer hold hosts

Re-check prompt

I have applied the fixes you listed for zones, pods and clusters. Here is the fresh output of listZones, listPods and listClusters. Confirm which of your earlier findings are now resolved, and list any that remain open or have reappeared.

Re-check  re-run list zones and confirm allocationstate reads Enabled on every zone

Note: listZones has no allocationstate request parameter — allocationstate is a response field only. Filter the response, do not try to filter the query.

02

Hosts & hypervisors

What to check

All hosts up, hypervisor versions consistent within each cluster, and no host carrying more load than it should.

Run

cmk list hosts details=capacity,stats cmk list hosts type=Routing state=Down cmk listHostsMetrics

Prompt

Here is my listHosts output. Identify any host not in Up state, list hosts whose resourcestate is not Enabled, flag hypervisorversion mismatches within the same clusterid, and highlight hosts where cpuallocatedpercentage is above 80 or memoryallocatedpercentage is above 85.

Improvements

  • Reconnect or rebuild hosts in Down or Alert state
  • Bring hypervisor versions into line within each cluster
  • Migrate VMs off overloaded hosts; use maintenance mode rather than pulling them

Re-check prompt

Here is my updated listHosts output after remediation. Confirm every host is now Up, check that hypervisor versions are consistent within each cluster, and tell me whether the hosts you flagged for over-allocation are now within threshold.

Re-check  list hosts state=Down  → must return empty, and no host left in a Maintenance or Error resourcestate

Use memorywithoverprovisioning rather than memorytotal — memorytotal is deprecated in current releases.

03

Storage pools

What to check

Primary and secondary pools up, free capacity healthy, over-provisioning within a ratio you can actually honour, and no orphaned volumes.

Run

cmk list storagepools cmk listStoragePoolsMetrics cmk list volumes

Prompt

Here is my listStoragePools and listVolumes output. Find pools below 20% free space, flag over-provisioning above 200%, and identify volumes in Error state or with no attached VM.

Improvements

  • Add capacity to pools approaching the threshold, before they cross it
  • Clean up orphaned volumes and stale snapshots
  • Review the over-provisioning ratio in global settings against real growth

Re-check prompt

Here is my updated listStoragePools and listVolumes output. Confirm every pool is now above 20% free, that over-provisioning is within the ratio we agreed, and that the orphaned volumes you identified are gone.

Re-check  diskSizeAvailable > 20% of diskSizeTotal on every pool

04

Virtual machines

What to check

Inventory by state, VMs stuck in Error or Unknown, machines with no network interface, and long-idle VMs nobody owns.

Run

cmk list virtualmachines listall=true cmk listVirtualMachinesMetrics listall=true

Prompt

Here is my listVirtualMachines output. List every VM not in Running or Stopped state, identify VMs with no network interface, and flag VMs created more than 180 days ago showing no activity.

Improvements

  • Expunge Error and Unknown VMs — after the owner confirms, not before
  • Attach missing network interfaces to orphaned VMs
  • Put a lifecycle policy in place so this list does not rebuild itself

Re-check prompt

Here is my updated listVirtualMachines output. Confirm no VMs remain in Error or Unknown state, that the VMs you flagged now have network interfaces, and list any new stale VMs since the last run.

Re-check  list virtualmachines state=Error listall=true  → must return empty

Without listall=true you see only your own account's instances, which is the most common reason an audit misses machines entirely.

05

Networks, VLANs & IP pools

What to check

Guest networks implemented, public IP pools not close to exhaustion, VLANs allocated and actually in use.

Run

cmk list networks listall=true cmk list publicipaddresses listall=true cmk list routers listall=true

Prompt

Here is my listNetworks and listPublicIpAddresses output. Identify networks not in Implemented state, flag IP pools above 90% utilisation, and list VLANs allocated but not in use.

Improvements

  • Restart or recreate guest networks stuck outside Implemented
  • Expand IP pools before exhaustion, not after the first failed deployment
  • Release unused public IPs back to the pool

Re-check prompt

Here is my updated listNetworks and listPublicIpAddresses output. Confirm all active networks are Implemented, that no IP pool is above 90% utilisation, and that the unused VLANs have been released.

Re-check  every active network reports state=Implemented

06

System VMs — SSVM & CPVM

What to check

Secondary Storage VM and Console Proxy VM running in every zone. These fail quietly and take console access and template operations with them.

Run

cmk list systemvms cmk list managementservers

Prompt

Here is my listSystemVms and listManagementServers output. Identify any SSVM or CPVM not in Running state, tell me whether every zone has both, and flag any management server whose state or last heartbeat looks wrong.

Improvements

  • Restart failed system VMs from the management console
  • Verify connectivity between management server and the system VM network
  • Check NTP sync — time skew is the most common cause of system VM failure

Re-check prompt

Here is my updated listSystemVms output. Confirm SSVM and CPVM are Running in every zone, and tell me whether any errors are still being recorded against them.

Re-check  every system VM reports state=Running

07

Capacity & global settings

What to check

Headroom across the estate, over-commitment ratios, HA enabled where it matters, and global settings that have drifted from sensible production values.

Run

cmk list capacity cmk list alerts cmk list asyncjobs cmk listManagementServersMetrics cmk list configurations

Prompt

Here is my listCapacity, listAlerts, listAsyncJobs and global configuration output. Highlight any capacity type above 80% used, summarise recurring alerts by type, flag async jobs that have been pending abnormally long, and list global settings that deviate from sensible production defaults.

Improvements

  • Add compute where CPU or RAM sits consistently above 75%
  • Tune timeout values to your actual network latency rather than the defaults
  • Enable HA on every production cluster

Re-check prompt

Here is my updated listCapacity output and global configuration. Confirm every capacity type is now below 75%, list any settings still deviating from production defaults, and confirm HA is enabled on all production clusters.

Re-check  all capacity types below 75% used

What a healthy environment looks like

Two different kinds of benchmark, and it is worth being clear about which is which. The first set is binary — there is no environment where a different answer is correct. The second set is a convention. Treat those as starting points and tune them to your growth rate and your procurement lead time.

Non-negotiable — these should be true everywhere

CheckHealthy stateIf not
Zones & podsAll EnabledCapacity you own but cannot allocate
HostsAll UpA host in Alert is not carrying load, and HA cannot use it
System VMsSSVM and CPVM Running, every zoneConsole access and template operations fail silently
Virtual machinesNone in Error or UnknownResources held by machines nobody can start
NetworksAll active networks ImplementedDeployments into that network will fail
Storage poolsAll UpVolumes on that pool are at risk, not just unavailable
Hypervisor versionsConsistent within each clusterLive migration fails, and behaviour differs host to host
NTPIn sync across management and hostsThe most common single cause of system VM failure
HAEnabled on production clustersA host failure becomes a manual recovery

Conventions — sensible defaults, not rules

MeasureCommon targetWhy that number, and when to move it
Primary storage freeAbove 20%Leaves room for snapshots and thin-provision growth between procurement cycles. Raise it if your growth is fast or lead times are long; a pool that fills stops writes.
Secondary storage freeAbove 25%Templates, ISOs and snapshot copies land here in bursts rather than steadily.
CPU allocatedBelow 80% per hostHeadroom to absorb a host failure without the remaining hosts refusing placement.
RAM allocatedBelow 85% per hostRAM is the constraint that actually blocks deployment, sooner than CPU in most estates.
Cluster capacityBelow 75% usedThe point at which adding hardware should already be in a budget, not a discussion.
CPU over-provisioning2:1 to 4:1Depends entirely on workload. Development estates take far more; latency-sensitive production takes less.
RAM over-provisioning1:1Over-committing memory is where over-provisioning stops being free.
Public IP poolBelow 90% usedExhaustion shows up as a failed deployment, usually at the worst moment.
Stale VMsReviewed at 180 daysNot a fault — a prompt to ask whether anyone still owns it.

Use these as a starting position

If a number in the second table does not fit your environment, change it — and write down why. A documented deviation is a decision. An undocumented one is something nobody can explain in six months when it causes a problem.

Prompt reference card

Four prompts that sit outside the seven areas. Bookmark these — they are the ones you will reach for repeatedly.

Full environment sweep

I am sharing the JSON output of my Apache CloudStack environment. Run a full health check across hosts, VMs, storage, networks and system VMs. List every issue by severity — Critical, Warning, Info — with the consequence of leaving each one, and the remediation. Finish with the three things I should fix first and why.

Turn findings into commands

Based on the Critical issues you found, write me the cloudmonkey commands to fix them. Put them in the order they should be run, mark any command that is disruptive or requires a maintenance window, and tell me what to verify after each one.

Capacity forecast

Using this listCapacity output, forecast when I run out of CPU, RAM and storage at current growth. State the growth assumption you are using. Recommend what to add and roughly when to order it.

Confirm resolution

Here is the updated API output after applying your recommended fixes. Confirm which issues are resolved and which remain open. For anything still open, tell me whether the fix was wrong, incomplete, or whether the problem was something else.

Read the output, do not just run it

Generated commands are a starting point, not an instruction. Check each one against your own environment before running it — particularly anything that expunges, destroys or restarts. Nothing in this guide should be executed on production without you understanding what it does.

Resources worth having open

Everything below is from the Apache project itself unless marked otherwise. If you are standing CloudStack up as your infrastructure layer, these are the pages to bookmark on day one rather than hunt for at 2am.

Releases

WhatWhere
Downloads — source, signatures, current versionscloudstack.apache.org/downloads
Signing keysdlcdn.apache.org/cloudstack/KEYS
All releases, with notes and CVE advisories per versionGitHub releases
Older versionsArchives
LTS policyLTS page on the project wiki

Current at the time of writing

4.22.1.0 is the current LTS release; 4.22.0.1 is the preceding maintenance release on that branch. LTS branches are supported for 24 months — full updates for the first 18, then blocker defects and security fixes only for the final 6.

We deliberately do not deep-link individual tarballs here. Those URLs change with every release and a stale download link is worse than no link. Take the source, signature and checksum from the downloads page, which is always current.

Packages — community maintained, not part of the signed Apache release

PlatformRepository
Ubuntu / Debiandownload.cloudstack.org/ubuntu
EL10 · EL9 · EL8el/10 · el/9 · el/8
SUSE / openSUSE 15download.cloudstack.org/suse/15
ARM64 — experimentaldownload.cloudstack.org/arm64
EL7 — for 4.19 and older onlydownload.cloudstack.org/el/7
System VM templatesdownload.cloudstack.org/systemvm
Kubernetes Service ISOsdownload.cloudstack.org/cks
Third-party packagesShapeBlue (noredist)

Documentation

WhatWhere
Documentation home — pick your version heredocs.cloudstack.apache.org
Installation guide4.22.1.0 install guide
Upgrade guide — read this before every upgrade4.22.1.0 upgrading
Administration guide4.22.1.0 admin guide
Release notes4.22.1.0 release notes
API referencecloudstack.apache.org/api · 4.22 root admin
Project wikiCloudStack wiki

Documentation paths follow the pattern docs.cloudstack.apache.org/en/<version>/<section>/ — swap the version to match the release you are actually running.

Read the upgrade section of the release notes for the version you are moving to, and every version you are skipping. Failed upgrades usually trace to skipped steps, not broken software.

Tooling and automation

ToolWhere
CloudMonkey CLI — 6.5.0Signed source · Binaries · Wiki
Terraform provider — v0.6.0Terraform registry · Source
Go SDKcloudstack-go releases
Kubernetes provider — v1.2.0Source · Docker image
Cluster API providerCAPC documentation

Security and community

WhatWhere
Security advisories and how to reportcloudstack.apache.org/security
Verifying downloads — the full explanationapache.org/info/verification
Mailing lists — users@ and dev@Mailing lists
Issue trackerGitHub issues

Subscribe to the users list before you need it

The mailing lists are where release announcements and security advisories land first. Subscribing takes a minute and is the cheapest early warning available for a platform you are about to run in production.

Tracking & sign-off

Record what you found, what you did, and whether the re-check passed. A row is not closed until the re-check returns empty — and a failed re-check reopens it rather than quietly staying shut.

#AreaIssue foundAction takenRe-checkStatus
1Hostshost-04 in Alert stateReconnected, agent restartedPassedClosed
2StoragePool primary-02 at 12% freeSnapshots prunedFailed — 17%Reopened
3System VMsSSVM zone-2 not runningNTP corrected, VM restartedPassedClosed

Audit cadence

FrequencyScope
DailySystem VMs, host state, active alerts
WeeklyVM states, storage capacity, IP pool utilisation
MonthlyFull seven-area audit, tracking table updated
QuarterlyCapacity planning, global settings, HA policy review

Or have us run it.

If the audit turns up more than your team can take on, that is what a health check engagement is for — we run all seven areas, hand you the findings with remediation, and re-check every one of them.

An engineer replies within two business days.