Proxmox VEXXII · Operating as a Business ServiceOperations
Operational discipline: inventory, tagging, change management
What you'll learn
- Build an inventory whose accuracy is verified by a script rather than asserted
- Design a tag taxonomy with a fixed key set, and enforce it with datacenter.cfg
- Reconcile the inventory against the live cluster and act on the differences
- Choose deliberate names and understand which of them cannot be changed later
Prerequisites
None — start here.
Verified against Proxmox VE 9.2.4 · Proxmox Backup Server 4.2.5 · Ceph Squid / Tentacle · Debian 13 (Trixie) · Linux kernel 7.0 (PVE 9.2 default) · 2026-08-12
Why this matters in production
A Proxmox cluster without discipline becomes unmanageable in months. Tags, inventory, and change management turn infrastructure chaos into operations.
Inventory
Every VM, container, and storage should be in an inventory. The minimum columns:
| Field | Why |
|---|---|
| VMID / CTID | Identity |
| Name | Display |
| Tier | RPO/RTO classification |
| Owner | Accountability |
| Application | What runs here |
| Backup schedule | When |
| Tags | Organisation |
| Notes | Anything else |
Maintain in a spreadsheet or CMDB. Update on every change.
An inventory nobody reconciles is fiction
Every estate has an inventory spreadsheet. Most of them were accurate on the day they were written. The difference between a useful inventory and a decorative one is not the tooling — it is whether something compares it against reality on a schedule and produces a list of differences.
set -euo pipefail
INVENTORY=/root/ops/inventory.csv # VMID in column 1
# What the cluster actually contains, guests and containers alike.
pvesh get /cluster/resources --type vm --output-format json \
| grep -oE '"vmid":[0-9]+' | cut -d: -f2 | sort -n > /tmp/cluster-vmids
# What the inventory claims.
awk -F, 'NR>1 {print $1}' "$INVENTORY" | sort -n > /tmp/inventory-vmids
echo '--- in the cluster, missing from the inventory (undocumented guests)'
comm -23 /tmp/cluster-vmids /tmp/inventory-vmids
echo '--- in the inventory, missing from the cluster (stale rows)'
comm -13 /tmp/cluster-vmids /tmp/inventory-vmids
# Guests with no owner tag at all - the ones nobody will claim in an incident.
for vmid in $(cat /tmp/cluster-vmids); do
tags=$(qm config "$vmid" 2>/dev/null | awk '/^tags:/ {print $2}')
case "$tags" in
*owner-*) ;;
*) echo "$vmid has no owner tag" ;;
esac
doneTagging
Proxmox supports tags on VMs, containers, storage, and nodes.
qm set 100 --tags 'tier-0,database,production'
Tags are searchable and can drive automation. Common conventions:
- By tier:
tier-0,tier-1,tier-2,tier-3. - By environment:
prod,staging,dev. - By owner:
team-platform,team-data. - By technology:
postgres,kafka,nginx.
Use key-value tags, not bare words
Proxmox tags are free-form strings with no structure imposed on them, which means the structure has to come from your convention. The convention that survives is a fixed set of keys, each with a controlled value list:
| Key | Values | Purpose |
|---|---|---|
tier- | 0, 1, 2, 3 | RPO/RTO class; drives backup and alerting policy |
env- | prod, stage, dev | Environment |
owner- | team identifier | Who is called |
app- | application identifier | What runs here |
os- | deb13, el9, win2025 | Patching cohort |
tier-0 and env-prod are parseable. production and important are not,
because six months later somebody adds prod, Production and live and
nothing can be selected reliably again.
The test for a good taxonomy is whether a script can answer a question with it. “List every Tier-0 production guest that is not in a backup job” is a one-liner against key-value tags and impossible against free prose.
set -euo pipefail
# Every guest carrying a given tag, cluster-wide, in one call.
pvesh get /cluster/resources --type vm --output-format json \
| grep -oE '"(vmid|name|tags)":("[^"]*"|[0-9]+)'
# Tier-0 guests and the node each one is on.
for vmid in $(qm list | awk 'NR>1 {print $1}'); do
tags=$(qm config "$vmid" | awk '/^tags:/ {print $2}')
case "$tags" in
*tier-0*) printf '%-6s %s\n' "$vmid" "$tags" ;;
esac
done
# Set tags. Note that --tags REPLACES the whole list rather than appending,
# which is the single most common way a tag gets silently dropped.
VMID=100
qm config "$VMID" | grep '^tags:' # read the current list first
qm set "$VMID" --tags 'tier-0,env-prod,owner-platform,app-postgres'Governing tags from datacenter.cfg
Two datacenter.cfg options turn a documented convention into an enforced
one, and they are the reason a taxonomy survives contact with a team:
| Option | Effect |
|---|---|
registered-tags | A list of tags that require Sys.Modify on / to set or delete. Put your policy-bearing tags here — tier-0, env-prod — so an ordinary user cannot reclassify their own guest into a stronger backup policy or out of one |
user-tag-access | Controls which tags a user may set on resources they control, with a user-allow-list for the permitted set |
tag-style | Presentation: color-map for per-tag colours, ordering (alphabetical by default, or config), shape, and case-sensitive |
case-sensitive deserves a moment. Left off, Prod and prod are the same
tag, which is usually what you want. Turned on, they are two tags and your
taxonomy has a hole in it that only shows up when a query returns fewer rows
than expected.
Change management
Infrastructure changes should follow a change management process:
- Request: what, why, when, who.
- Review: by a peer or senior; risk assessment.
- Approval: by change authority.
- Implementation: during change window.
- Verification: confirm expected outcome.
- Documentation: update the runbook or inventory.
Naming conventions
Naming should be deliberate. Suggested patterns:
- VMs:
app-env-nn, for examplewebapp-prod-01 - Containers:
ct-app-env-nn, or follow the VM convention - Storage:
role-tech-node, for examplevmdata-zfs-n1
Which identifiers you can change later, and which you cannot
Not every name in a Proxmox estate is equally revisable, and knowing the difference before you allocate one saves a rebuild.
| Identifier | Changeable? | Consequence |
|---|---|---|
| Guest name | Freely, at any time | Cosmetic |
| Tags | Freely | Watch the replace-not-append behaviour |
| Storage ID | Effectively no | Every guest configuration references it by name; renaming means editing them all |
| VMID | No | It is the identity. Changing it means creating a new guest and moving disks, and it breaks backup history, which is keyed on the guest ID |
| Node hostname | Only by removing and re-adding the node to the cluster | /etc/pve/nodes/<name>/ is keyed on it |
| Cluster name | No supported path | Set once at pvecm create |
Production considerations
Common mistakes
- An inventory nobody reconciles, which is accurate on the day it is written and decorative thereafter.
- Ad-hoc tags with no key structure, so nothing can be selected reliably.
qm set --tagsused as if it appends, silently dropping the guest’s classification.- No
registered-tags, so a user can move their own guest into a stronger backup policy or out of one. - Assigning tiers by asking owners how important their application is.
- Retro-fitting a VMID scheme, discarding backup history in the process.
- Change requests with insufficient detail for anyone to assess risk.
Key takeaways
- An inventory is only as good as the script that reconciles it; run it weekly and treat every difference as a finding.
- Use key-prefixed tags with controlled values so the taxonomy is queryable.
--tagsreplaces the list. Read, merge, write.registered-tagsanduser-tag-accessindatacenter.cfgare what make a convention an enforced one.- Tier is the tag that pays for itself, because backup, alerting, HA and cost all consult it.
- The VMID is permanent. Choose a scheme now; do not renumber later.
Knowledge check
Knowledge check · 5 questions
Q1. A guest is tagged tier-0,env-prod,owner-platform. An automation script runs qm set 100 --tags backup-nightly. What is the resulting tag list?
Q2. Which identifiers in a Proxmox estate are effectively permanent once allocated? Select all that apply.
Q3. Putting tier-0 into registered-tags in datacenter.cfg means an ordinary user cannot reclassify their own guest into that tier.
Q4. Why should service tiers be assigned from a written definition of RPO and RTO rather than by asking application owners how important their application is?
Q5. A weekly reconciliation finds a running guest that appears in no inventory and carries no owner tag. What makes this expensive?
Passing score: 75%. Answers are checked in this browser.