LinuxLXXXIII · Operational DocumentationRecords
Inventories, maintenance procedures and escalation paths
What you'll learn
- Distinguish the declared inventory from the discovered one and reconcile the two
- Record ownership in a form that survives people leaving
- Document recurring maintenance so that it is scheduled rather than remembered
- Write an escalation path that a responder can use at 3am, and test it
Prerequisites
Verified against Ubuntu 24.04 LTS · Debian 12 (Bookworm) · RHEL 9.x · Rocky Linux 9.x · AlmaLinux 9.x · Linux kernel 6.1 LTS / 6.6 LTS · systemd 255+ · OpenSSH 8.7p1 (RHEL 9) / 9.6p1 (Ubuntu 24.04) · nftables 1.0.x · chrony 4.x · Pacemaker 2.1.x · Corosync 3.1.x · 2026-08-11
Three documents in this part are not procedures. Nobody executes them step by step, so they are written once and then rot quietly, and each one turns into an incident in its own characteristic way.
The inventory rots into a host nobody knew was running. The maintenance record rots into a certificate that expires. The escalation path rots into a vendor support account with no active entitlement, discovered at 02:40 on a Sunday.
The inventory: two lists, and the gap between them
There is a mechanical part to inventory - collecting facts,
naming conventions, dynamic sources - covered in
linux-naming-and-inventory and linux-inventory-and-facts.
This lesson is about the part that makes it useful, which is
that you always have two inventories and the interesting
information is in their difference.
The declared inventory is what should exist: the CMDB, the Ansible inventory, the Terraform state, the spreadsheet. It is authoritative about intent.
The discovered inventory is what actually responds: DNS records that resolve, hosts that answer on the management network, machines reporting into monitoring or configuration management in the last 24 hours. It is authoritative about reality.
Reconciling them takes one command and produces two lists, both of which are findings:
sort -u /srv/inventory/declared-hosts.txt > /tmp/declared
sort -u /srv/inventory/seen-last-24h.txt > /tmp/discovered
comm -23 /tmp/declared /tmp/discovered # declared, not seen
comm -13 /tmp/declared /tmp/discovered # seen, not declared
Declared but not seen is a host that is down and unnoticed, or one that was decommissioned without the record being updated. The first is an outage nobody has reported; the second is why your capacity numbers are wrong.
Seen but not declared is worse. It is a host running on your network that no process created and no process patches: a machine built for a migration that was never turned off, a test box someone stood up with a copy of production data, or something that is not yours at all. Nothing else in your tooling will find it, because every other tool starts from the declared list.
Run the reconciliation on a schedule and treat a non-empty result as work, not as a report.
What a host record needs
Most inventories record the technical facts, which configuration management can rediscover anyway. The fields that matter are the ones no tool can derive:
| Field | Why it is the one that matters |
|---|---|
| Owning team | Who decides, and who is paged |
| Service and environment | Whether this is production |
| Criticality | Whether it can wait until Monday |
| Data classification | Whether an incident is also a breach |
| Build source | Which image or playbook produced it, so a fix propagates |
| Backup and monitoring coverage | Whether the absence of alerts means anything |
| Lifecycle dates | Built, last patched, planned retirement |
The decommission gap
A host is rarely “removed”. It is powered off, and then it persists in:
- DNS, including reverse records
- the monitoring system, where it now alerts as down forever or was silenced and forgotten
- firewall rules and security-group memberships
authorized_keysand credential grants on other hosts- backup job configuration, failing nightly
- load balancer pools, health-checking a dead address
- the inventory itself
Each of these is small. Collectively they are why nobody can tell which alerts matter. Decommissioning deserves a checklist as much as building does, and the checklist should end with the inventory record being marked retired rather than deleted - a deleted record cannot answer the question “what was 192.0.2.47 six months ago?”, which is the exact question a forensic timeline asks.
Maintenance procedures
Maintenance is the work that has no ticket because nothing is broken: patch cycles, certificate renewals, backup restore tests, log retention review, capacity review, credential rotation, cluster failover exercises.
Documenting it is necessary and not sufficient. The property that decides whether maintenance happens is whether it is scheduled - attached to a date and an owner - rather than merely described.
# Anything already running on a timer is maintenance that will happen
systemctl list-timers --all --no-pager
For each recurring item, record four things:
MAINTENANCE: <name>
=========================
Cadence : <how often, and any window constraint>
Owner : <rota>
Trigger : <timer, calendar entry, or ticket automation>
Procedure : <link to the runbook that performs it>
Evidence : <what proves it was done - a log, a ticket, a report>
The Trigger line is what separates a maintenance
programme from a wish list. If the only trigger is that
someone remembers, the item will be skipped during the first
busy month and never resume.
The Evidence line is what makes it auditable, and it
answers a question that comes up in every post-incident
review: was the maintenance actually performed? “It is in
the schedule” is not an answer. A ticket, a timer’s
journalctl record, or a dated report is.
Escalation paths
Escalation documentation is read exactly once per incident, under maximum time pressure, by someone who needs a phone number rather than an org chart.
What it must contain, per path:
- The trigger. The condition under which you escalate, stated as a criterion rather than a feeling: “the service has been down for 20 minutes and the cause is not identified”, “the failure involves data loss”, “a security control has been bypassed”.
- The destination. A rota name and the exact route - which paging tool, which channel, which phone number. Not a team page on the wiki.
- What to have ready. The three or four facts the receiving team will ask for first. This turns a five-minute handover into a one-minute one, and it is the part responders most appreciate.
- The out-of-hours difference. The route at 15:00 and the route at 03:00 are rarely the same, and the document should say both.
Vendor escalation needs more, because it involves a contract:
VENDOR: <name>
====================
Support portal : <url>
Account / site ID: <id>
Contract number : <id>, expires <date>
Entitlement : <24x7 or business hours; response time per severity>
Severity mapping : <what the vendor calls a P1, in their words>
Who can open a case: <named accounts, or the shared credential path>
Phone (24x7) : <number>
Last tested : <date and by whom>
Knowledge check
Knowledge check · 4 questions
Q1. Which inventory reconciliation result is most concerning?
Q2. Recording an individual engineer as the owner of a host is acceptable as long as the inventory is reviewed annually.
Q3. A documented maintenance task is fully automated on a systemd timer. What still has to exist for it to count as performed? Select all that apply.
Q4. What should an escalation record carry that most do not?
Passing score: 75%. Answers are checked in this browser.