{"id":941,"date":"2026-10-29T05:10:00","date_gmt":"2026-10-29T05:10:00","guid":{"rendered":"https:\/\/lightsportwest.com\/blog\/?p=941"},"modified":"2026-10-29T05:10:00","modified_gmt":"2026-10-29T05:10:00","slug":"automationops-compared-execution-surfaces-maturity","status":"publish","type":"post","link":"https:\/\/lightsportwest.com\/blog\/automationops-compared-execution-surfaces-maturity\/","title":{"rendered":"AutomationOps Tooling Compared: Where Jobs Should Run"},"content":{"rendered":"<p>Choosing where an operational job runs is a design decision, not a default. The same restart, rotation or fleet-wide clean-up behaves differently depending on the surface that executes it: what rehearsal it supports, how tightly it limits damage, how clearly it records who did what. AutomationOps, the governance practice set out by <a href=\"https:\/\/www.xopsschool.com\/automationops\/\">the Ops Atlas field guide to AutomationOps<\/a>, treats that choice as central. This comparison examines the four surfaces most teams choose between, the test tooling that supports all of them, and the maturity ladder that tells you whether your current choice is serving you.<\/p>\n<h2>AutomationOps Execution Surfaces, Compared<\/h2>\n<h3>Configuration management engines<\/h3>\n<p>Ansible and Puppet \u2014 the latter now continuing as the community OpenVox fork \u2014 remain the workhorses for declaring and enforcing state across many machines, and they double as vehicles for ad-hoc execution. Their strengths for governed automation are concrete: inventories give explicit target lists, check mode provides a rehearsal, and serial execution with <em>max_fail_percentage<\/em> enforces batched rollouts that halt when a defined share of a wave fails. The caveat is equally concrete: check mode passes over direct command and shell probes unless they are explicitly enabled, so a rehearsal that relies on them is incomplete by default.<\/p>\n<h3>Runbook platforms<\/h3>\n<p>Rundeck and StackStorm wrap individual jobs in an operational interface: credentials belong to the platform rather than to whoever presses the button, executions are logged per job, and access can be scoped per command. For tier 1 work \u2014 reversible, single-target actions such as service restarts \u2014 a runbook platform delivers most of the guardrail framework with little bespoke engineering. Its limitation is breadth: it governs the jobs you register, and says nothing about the cron entries nobody told it about.<\/p>\n<h3>Event-driven runners<\/h3>\n<p>Event-Driven Ansible and its counterparts attach automation to conditions: a queue depth, a failed unit, an alert. Speed is their argument; containment is their requirement. An event-triggered action acts without a human in the loop, so the surrounding guards \u2014 target validation, batching, budgets, an independent off switch \u2014 must be stronger, not weaker, than for scheduled equivalents. The rule worth adopting: the more automatic the trigger, the more deliberate the governor.<\/p>\n<h3>Cloud runbook services<\/h3>\n<p>AWS SSM Automation and Azure Automation provide managed execution with native identity, approval hooks and audit trails already attached. They suit teams that would otherwise have to build those features themselves. Policy enforcement can reach into the details \u2014 SSM parameters accept an <em>allowedPattern<\/em>, so a malformed value is rejected before any job consumes it \u2014 and approvals can be tied to risk tier rather than applied uniformly.<\/p>\n<h2>Which Surface Supports Which Guardrail<\/h2>\n<p>Summarised against the five core controls, the surfaces divide cleanly:<\/p>\n<ul>\n<li><strong>Rehearsal:<\/strong> native in configuration engines via check mode (with the probe caveat); simulated elsewhere only if you build it.<\/li>\n<li><strong>Target validation:<\/strong> strongest where inventories or explicit target lists exist; weakest in ad-hoc shell invocations, which accept whatever the terminal pastes.<\/li>\n<li><strong>Blast-radius capping:<\/strong> built into configuration engines through serial and failure-percentage settings; achievable in runbook platforms through node filters and batching; manual elsewhere.<\/li>\n<li><strong>Failure budget:<\/strong> a per-run halt threshold; native in rollouts via failure percentages, self-managed everywhere else.<\/li>\n<li><strong>Kill switch:<\/strong> every surface can expose one; only drilled procedure makes it real, regardless of vendor.<\/li>\n<\/ul>\n<p>Attribution deserves its own line in the ledger. On a runbook platform or a managed cloud service, the executing identity is the job&#8217;s, and the log reads unambiguously. On raw configuration engines, execution inherits whoever launched it \u2014 which is workable, provided each job holds a distinct credential rather than a team login. What the comparison rules out at every level is the single god credential: without per-job identity, no surface can tell you what acted, and no incident review can close.<\/p>\n<p>Test and lint tooling cuts across all four columns. ShellCheck audits shell scripts before they ship, ansible-lint enforces structural rules on playbooks, and Molecule verifies automation code in disposable environments \u2014 its default sequence includes an idempotence step, so a job that claims to converge state is actually tested for converging. Treat these as the guard tests that run in CI before any change reaches a surface, and treat their absence on any surface as a finding, not a preference.<\/p>\n<h2>The AutomationOps Maturity Ladder Decides the Comparison<\/h2>\n<p>The Atlas models progress in five levels, and the ladder explains why identical tooling produces different outcomes:<\/p>\n<ol>\n<li><strong>Ad hoc.<\/strong> Jobs live in personal directories and personal accounts. Nothing is shared; nothing is stoppable by anyone else.<\/li>\n<li><strong>Shared.<\/strong> Scripts move into Git. Colleagues can find them \u2014 and nothing else has changed: no owners, no rehearsal, frequently one shared credential.<\/li>\n<li><strong>Guarded.<\/strong> The five controls attach: rehearsals, refusal of empty target lists, batches, budgets, drilled switches.<\/li>\n<li><strong>Governed.<\/strong> Automation is registered with tier, limits, identity and review date; approvals follow the tier; coverage is measured.<\/li>\n<li><strong>Self-correcting.<\/strong> The system audits itself: unregistered automation surfaces automatically, and incidents feed back into the guards.<\/li>\n<\/ol>\n<p>The documented stall point is level 2, and it deserves emphasis because it mimics progress. Moving scripts into a repository feels like governance and is only storage. A team can remain at level 2 for years \u2014 version-controlled, peer-reviewed, and still one shared login away from an unattributable incident. The comparison above is what moves a team past the stall: each surface choice either attaches the level 3 controls or leaves them unbuilt.<\/p>\n<h2>Matching the Surface to the Job<\/h2>\n<p>Precision beats preference. Grade the job first; let the tier select the surface. Read-only reporting runs anywhere, because it changes nothing. Reversible single-target actions belong on a runbook platform, where identity and logging are already solved. Fleet-wide reversible changes belong on a configuration engine, where serial rollout and failure thresholds are already solved. Actions triggered by events belong on event-driven runners only when their governors are stronger than the trigger. Irreversible, data-destroying work \u2014 tier 3 \u2014 deserves the managed services with approval hooks, a second person&#8217;s sign-off, staged deletion and a rollout stretched across time.<\/p>\n<p>Whatever the mapping, registration comes with it: an entry as code carrying owner, tier, limits and review date, so the choice is auditable rather than folkloric. Teams wanting the monitoring perspective on how these jobs behave in production will find the site&#8217;s coverage of <a href=\"https:\/\/lightsportwest.com\/blog\/intelligent-incident-management-with-aiops-platforms\/\">intelligent incident management with AIOps platforms<\/a> a useful companion, as will its primer on <a href=\"https:\/\/lightsportwest.com\/blog\/scaling-automation-the-core-principles-of-robotops\/\">the core principles of RobotOps<\/a> for the physical-automation analogue, and its overview of <a href=\"https:\/\/lightsportwest.com\/blog\/site-reliability-engineering-training-for-modern-devops-professionals\/\">site reliability engineering training<\/a> for the toil-measurement discipline that feeds candidates in.<\/p>\n<h2>The Standard Behind the Comparison<\/h2>\n<p>Run the same comparison in any serious operations organisation and the conclusion converges: the surface is a control, not a convenience. Teams that select it deliberately \u2014 rehearsal where probes really run, batching where damage could spread, identity where attribution matters, registration everywhere \u2014 spend their engineering time on new problems. Teams that leave the choice to habit spend it on post-mortems. The Atlas&#8217;s framework makes the deliberate path specific enough to implement this week, which is precisely what a professional standard should do.<\/p>\n<p>One practical sequence closes the loop: inventory what already runs, grade it by tier, and let each tier name its surface \u2014 then revisit the mapping every quarter, because jobs grow, fleets grow, and a surface chosen for a five-machine estate rarely suits a fifty-machine one.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Config management, runbook platforms, event-driven runners and cloud services compared through AutomationOps guardrails, plus the maturity ladder.<\/p>\n","protected":false},"author":6,"featured_media":942,"comment_status":"","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[591],"tags":[],"class_list":["post-941","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-aviation"],"_links":{"self":[{"href":"https:\/\/lightsportwest.com\/blog\/wp-json\/wp\/v2\/posts\/941","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/lightsportwest.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/lightsportwest.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/lightsportwest.com\/blog\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/lightsportwest.com\/blog\/wp-json\/wp\/v2\/comments?post=941"}],"version-history":[{"count":1,"href":"https:\/\/lightsportwest.com\/blog\/wp-json\/wp\/v2\/posts\/941\/revisions"}],"predecessor-version":[{"id":943,"href":"https:\/\/lightsportwest.com\/blog\/wp-json\/wp\/v2\/posts\/941\/revisions\/943"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/lightsportwest.com\/blog\/wp-json\/wp\/v2\/media\/942"}],"wp:attachment":[{"href":"https:\/\/lightsportwest.com\/blog\/wp-json\/wp\/v2\/media?parent=941"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/lightsportwest.com\/blog\/wp-json\/wp\/v2\/categories?post=941"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/lightsportwest.com\/blog\/wp-json\/wp\/v2\/tags?post=941"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}