Ansible · Curriculum
Curriculum
374 lessons across 58 parts. Lessons build on each other; later parts assume familiarity with earlier material.
Part I
Why Configuration Management Exists
Manual administration, shell scripts, snowflake servers, drift, and when each approach is appropriate.
- 01Welcome to Ansible for Production SysadminsCourse introduction · foundation · ~9 min
- 02Drift, and how a snowflake is actually madeThe problem before the tool · foundation · ~16 min
- 03Manual administration, honestlyThe problem before the tool · foundation · ~15 min
- 04Shell scripts: the first automation, and where it breaksThe problem before the tool · foundation · ~18 min
- 05The configuration management modelThe four approaches · foundation · ~17 min
- 06Immutable infrastructure, and why it does not delete this courseThe four approaches · foundation · ~17 min
- 07What automation costsThe four approaches · foundation · ~16 min
- 08Choosing an approach for a given estateThe four approaches · foundation · ~20 min
Part II
Ansible Architecture
Agentless execution, control node, managed nodes, SSH transport, and what actually happens during a run.
- 01What agentless actually meansThe execution model · foundation · ~16 min
- 02Control node and managed node responsibilitiesThe execution model · foundation · ~18 min
- 03Anatomy of a run, start to finishThe execution model · foundation · ~22 min
- 04How a module gets to the target: AnsiballZ and pipeliningThe execution model · intermediate · ~20 min
- 05Connection plugins: SSH is a default, not a lawThe execution model · intermediate · ~18 min
- 06The push model and who can reach whomThe execution model · intermediate · ~19 min
- 07What Ansible does not do for youThe execution model · intermediate · ~17 min
Part III
Installing and Designing the Controller
Packages, pipx, virtualenvs, ansible-core vs the community package, and a reproducible controller environment.
- 01ansible-core versus the ansible community packageChoosing what to install · foundation · ~16 min
- 02The support matrix, and which Python is whichChoosing what to install · foundation · ~18 min
- 03Installing: pipx, virtualenv, pip and the distro packageInstalling the controller · foundation · ~20 min
- 04A controller you can rebuild identicallyInstalling the controller · intermediate · ~22 min
- 05Controller filesystem layout and ownershipController design · intermediate · ~21 min
- 06Whose machine runs production change?Controller design · intermediate · ~19 min
- 07Upgrading Ansible without surprising the fleetController design · intermediate · ~22 min
Part IV
Inventory Fundamentals
INI and YAML inventories, groups, children, host and group variables, and inventory inspection.
- 01INI and YAML inventories, side by sideInventory mechanics · foundation · ~20 min
- 02Groups, children, and the two groups you never wroteInventory mechanics · foundation · ~20 min
- 03group_vars and host_vars on diskInventory mechanics · intermediate · ~22 min
- 04Ranges, aliases and connection variablesInventory mechanics · intermediate · ~20 min
- 05Proving what your inventory containsInventory inspection · intermediate · ~21 min
- 06More than one inventory sourceInventory inspection · intermediate · ~20 min
- 07When two groups disagreeInventory inspection · advanced · ~22 min
Part V
Inventory Design at Fleet Scale
Fleet taxonomy, environment and role dimensions, and why a poor inventory becomes an operational hazard.
- 01The four dimensions of a fleetFleet taxonomy · intermediate · ~16 min
- 02Environment separation you can rely onFleet taxonomy · intermediate · ~16 min
- 03Role groups and who owns themFleet taxonomy · intermediate · ~17 min
- 04Lifecycle stages and hosts you must not touchFleet taxonomy · intermediate · ~18 min
- 05Contradictory membership is an outage waitingFleet taxonomy · advanced · ~19 min
- 06Reading an inventory as a blast-radius mapFleet taxonomy · advanced · ~17 min
- 07Where the truth about the fleet livesFleet taxonomy · advanced · ~18 min
Part VI
Configuration and Precedence
ansible.cfg locations, precedence, forks, timeouts, interpreter discovery, and settings not to weaken.
- 01Which ansible.cfg is actually in effectConfiguration and precedence · intermediate · ~16 min
- 02The config file Ansible refuses to readConfiguration and precedence · intermediate · ~15 min
- 03Proving a setting's value and its sourceConfiguration and precedence · intermediate · ~17 min
- 04Forks, timeouts and what they costConfiguration and precedence · intermediate · ~17 min
- 05Interpreter discovery, configuredConfiguration and precedence · advanced · ~17 min
- 06The settings you will be tempted to weakenConfiguration and precedence · advanced · ~20 min
- 07The project config is part of the automationConfiguration and precedence · advanced · ~18 min
Part VII
Ad-Hoc Execution
When an ad-hoc command is the right tool, when a playbook is, and the auditability difference.
- 01Anatomy of an ad-hoc commandAd-hoc execution · foundation · ~16 min
- 02When ad-hoc is right, and when it is notAd-hoc execution · foundation · ~14 min
- 03Ad-hoc as a fleet inspection instrumentAd-hoc execution · foundation · ~18 min
- 04Blast radius of a one-line commandAd-hoc execution · advanced · ~18 min
- 05What an ad-hoc change leaves behindAd-hoc execution · intermediate · ~17 min
- 06Promoting an ad-hoc command to a playbookAd-hoc execution · intermediate · ~20 min
Part VIII
Modules and the Module Model
The module contract, return values, and choosing purpose-built modules over shell.
- 01The module contractThe module model · intermediate · ~19 min
- 02Reading module documentation like an operatorThe module model · intermediate · ~18 min
- 03Fully qualified names and how a module is foundThe module model · intermediate · ~17 min
- 04Not everything runs on the targetThe module model · intermediate · ~18 min
- 05Choosing a module, and what you lose without oneThe module model · intermediate · ~19 min
- 06Check-mode support is a per-module propertyThe module model · intermediate · ~18 min
- 07How modules fail, and what the error meansThe module model · intermediate · ~20 min
Part IX
command, shell and raw
Shell expansion, quoting, idempotency and security consequences of each execution module.
- 01command: no shell, and why that is the safe onecommand, shell and raw · intermediate · ~16 min
- 02shell: when you genuinely need a shell, and what you acceptcommand, shell and raw · intermediate · ~17 min
- 03A variable inside a shell line is an injection pointcommand, shell and raw · advanced · ~20 min
- 04raw: the escape hatch, and its exact pricecommand, shell and raw · advanced · ~16 min
- 05Making an unavoidable shell task idempotentcommand, shell and raw · advanced · ~18 min
- 06script: transferring a script and running itcommand, shell and raw · intermediate · ~15 min
- 07A worked replacement: one shell-heavy play, rewrittencommand, shell and raw · advanced · ~20 min
Part X
YAML for Reliable Automation
Types, quoting, multiline strings, and the YAML traps that silently change automation behaviour.
- 01The YAML a playbook actually isYAML for reliable automation · foundation · ~15 min
- 02Types you did not ask forYAML for reliable automation · intermediate · ~18 min
- 03Quoting, and the double-brace ruleYAML for reliable automation · intermediate · ~16 min
- 04Multiline values that surviveYAML for reliable automation · intermediate · ~15 min
- 05File modes: quote themYAML for reliable automation · intermediate · ~14 min
- 06The traps that do not raise an errorYAML for reliable automation · intermediate · ~17 min
Part XI
Playbooks
Plays, tasks, become, execution order, and the anatomy of a maintainable playbook.
- 01Anatomy of a playPlaybooks · intermediate · ~14 min
- 02Execution order inside a playPlaybooks · intermediate · ~16 min
- 03The hosts: line is the blast radiusPlaybooks · intermediate · ~15 min
- 04The pre-flight options, and what each one provesPlaybooks · intermediate · ~18 min
- 05Composing a site.ymlPlaybooks · intermediate · ~15 min
- 06A playbook someone else can operatePlaybooks · intermediate · ~16 min
- 07Reading the recap, and the exit codePlaybooks · intermediate · ~18 min
Part XII
Idempotency and Change Reporting
Declarative state, convergence, and why an inaccurate changed result destroys trust and handlers.
- 01Describing state instead of stepsIdempotency and change reporting · intermediate · ~15 min
- 02What idempotent means, preciselyIdempotency and change reporting · intermediate · ~14 min
- 03How Ansible decides ok versus changedIdempotency and change reporting · intermediate · ~18 min
- 04changed_when: telling the truth about a commandIdempotency and change reporting · intermediate · ~18 min
- 05failed_when: when non-zero is not a failureIdempotency and change reporting · intermediate · ~17 min
- 06Why a wrong changed breaks the machineryIdempotency and change reporting · intermediate · ~17 min
- 07changed=0 as the cheapest signal an estate producesIdempotency and change reporting · intermediate · ~16 min
- 08The operations that cannot be idempotentIdempotency and change reporting · intermediate · ~17 min
Part XIII
Variables and Precedence
Variable sources, practical precedence design, and why heavy -e use makes an estate hard to reason about.
- 01Every place a variable can come fromVariable sources · intermediate · ~16 min
- 02The precedence order, verified by experimentVariable sources · intermediate · ~22 min
- 03Finding out what a variable actually isDiagnosis · intermediate · ~20 min
- 04A layering rule you can hold in your headDesign · intermediate · ~22 min
- 05defaults/ and vars/ are a policy decisionDesign · intermediate · ~18 min
- 06-e always wins, and that is the problemDesign · intermediate · ~19 min
- 07Names that do not collideDesign · intermediate · ~18 min
- 08A precedence incident, worked end to endDiagnosis · intermediate · ~21 min
Part XIV
Facts and Registered Variables
Fact gathering, ansible_facts, caching, register, and reading structured module results.
- 01What fact gathering actually costsFact gathering · intermediate · ~24 min
- 02Reading ansible_facts properlyFact gathering · intermediate · ~21 min
- 03Which facts you can trustFact gathering · intermediate · ~23 min
- 04Custom facts with facts.dFact gathering · intermediate · ~22 min
- 05Fact caching and stale truthFact gathering · advanced · ~26 min
- 06register and the shape of a resultRegistered variables · intermediate · ~25 min
- 07set_fact, register or inventory?Registered variables · advanced · ~24 min
Part XV
Conditionals and Loops
when, modern loop syntax, loop control, and logic that belongs in inventory instead.
- 01when expressions that hold upConditionals · intermediate · ~24 min
- 02Conditioning on a previous taskConditionals · intermediate · ~22 min
- 03loop, and when not to use oneLoops · intermediate · ~24 min
- 04loop_control and readable runsLoops · intermediate · ~21 min
- 05Retry loops for genuinely transient faultsLoops · intermediate · ~22 min
- 06Reading inherited with_* codeLoops · intermediate · ~22 min
- 07Conditionals that should have been groupsConditionals · advanced · ~26 min
Part XVI
Handlers
notify, handler ordering, flush_handlers, and change-triggered restarts as a safety mechanism.
- 01Handlers as a safety mechanismHandlers · intermediate · ~18 min
- 02Handler ordering and flush_handlersHandlers · intermediate · ~20 min
- 03listen topics as a handler interfaceHandlers · intermediate · ~18 min
- 04The handler that never ranHandlers · advanced · ~21 min
- 05Naming handlers, and role collisionsHandlers · advanced · ~19 min
- 06Restart, reload, and doing it to everyone at onceHandlers · advanced · ~20 min
Part XVII
Templates and Jinja2
Jinja for sysadmins, filters, defaults, and validating rendered configuration before it goes live.
- 01Jinja2 for sysadminsTemplates and Jinja2 · intermediate · ~20 min
- 02The template module in productionTemplates and Jinja2 · intermediate · ~19 min
- 03The filters you will actually useTemplates and Jinja2 · intermediate · ~20 min
- 04Undefined variables and silent wrong outputTemplates and Jinja2 · advanced · ~20 min
- 05Validate before it becomes liveTemplates and Jinja2 · advanced · ~22 min
- 06Where validate is not enoughTemplates and Jinja2 · advanced · ~22 min
- 07Template a drop-in, not the whole fileTemplates and Jinja2 · intermediate · ~19 min
- 08Templates that survive reviewTemplates and Jinja2 · intermediate · ~19 min
Part XVIII
Files and Configuration Management
copy, file, template, lineinfile and blockinfile, and when each is the maintainable choice.
- 01Which file module, and whyFiles and configuration management · intermediate · ~18 min
- 02file and the meaning of stateFiles and configuration management · intermediate · ~16 min
- 03lineinfile without the idempotency trapFiles and configuration management · advanced · ~22 min
- 04Owning a region of a file you do not ownFiles and configuration management · intermediate · ~18 min
- 05Permissions and context as desired stateFiles and configuration management · intermediate · ~18 min
- 06backup: and atomic replacementFiles and configuration management · intermediate · ~18 min
- 07Knowing what is there before you change itFiles and configuration management · intermediate · ~18 min
Part XIX
Privilege Escalation
become, become_user, become_method, sudo integration, and least privilege on managed nodes.
- 01What become actually doesPrivilege escalation · intermediate · ~18 min
- 02Escalation methods and where they applyPrivilege escalation · intermediate · ~16 min
- 03Escalation passwords without leaking themPrivilege escalation · intermediate · ~17 min
- 04Least privilege for the automation accountPrivilege escalation · advanced · ~22 minLab
- 05Unprivileged-to-unprivileged escalationPrivilege escalation · advanced · ~20 min
- 06Reading a become failurePrivilege escalation · advanced · ~20 min
Part XX
SSH Architecture and Connectivity
Keys, agents, host key verification, bastions, ProxyJump, connection reuse and pipelining.
- 01What happens on the wire during a runSSH architecture and connectivity · intermediate · ~22 min
- 02Keys and agents for unattended runsSSH architecture and connectivity · intermediate · ~24 min
- 03Host key verification is a security controlSSH architecture and connectivity · advanced · ~25 min
- 04Reaching a fleet through a bastionSSH architecture and connectivity · advanced · ~24 min
- 05Connection reuse and why runs get slowSSH architecture and connectivity · advanced · ~23 min
- 06Pipelining and its preconditionsSSH architecture and connectivity · advanced · ~22 min
- 07Triaging unreachable hostsSSH architecture and connectivity · advanced · ~24 min
Part XXI
Secrets Management
Vault, vault IDs, external secret managers, no_log, and the ways secrets actually leak.
- 01The ways secrets actually leakSecrets management · intermediate · ~24 min
- 02Vault file operationsSecrets management · intermediate · ~22 min
- 03Encrypting one variable, not the whole fileSecrets management · intermediate · ~22 min
- 04Vault IDs across environmentsSecrets management · advanced · ~24 min
- 05Where the vault password livesSecrets management · advanced · ~24 min
- 06What Vault does not protectSecrets management · advanced · ~22 min
- 07no_log, and what it costs youSecrets management · advanced · ~24 min
- 08When the secret should not be in the repository at allSecrets management · advanced · ~24 min
Part XXII
Roles and Reuse
Role structure, boundaries, interfaces, dependencies, and include versus import semantics.
- 01Role anatomy and where roles are foundRoles and reuse · intermediate · ~18 min
- 02What belongs in one roleRoles and reuse · intermediate · ~18 min
- 03defaults/ is the interface, vars/ is notRoles and reuse · intermediate · ~19 min
- 04Roles that refuse bad inputRoles and reuse · intermediate · ~20 min
- 05Static and dynamic role reuseRoles and reuse · intermediate · ~22 min
- 06Dependencies and the roles you did not ask forRoles and reuse · intermediate · ~20 min
- 07Handlers across role boundariesRoles and reuse · advanced · ~19 min
- 08Refactoring a monolith into rolesRoles and reuse · advanced · ~22 min
Part XXIII
Tags, Blocks and Error Handling
tags, block/rescue/always, failed_when, retries, and why blanket ignore_errors hides outages.
- 01Tags as an operational controlError handling · intermediate · ~19 min
- 02always, never, tagged and untaggedError handling · intermediate · ~17 min
- 03The tag that selected nothingError handling · advanced · ~19 min
- 04Blocks and shared directivesError handling · intermediate · ~18 min
- 05rescue and alwaysError handling · advanced · ~22 min
- 06Overriding the module verdictError handling · intermediate · ~18 min
- 07Why ignore_errors: true hides outagesError handling · advanced · ~21 min
- 08When a retry makes it worseError handling · advanced · ~20 min
Part XXIV
Assertions and Guardrails
Preconditions, assert and fail, and automation that refuses to perform an unsafe operation.
- 01Check the world before you change itAssertions and guardrails · intermediate · ~20 min
- 02Writing assertions operators can act onAssertions and guardrails · intermediate · ~22 min
- 03Automation that refusesAssertions and guardrails · intermediate · ~22 min
- 04Guarding against the wrong fleetAssertions and guardrails · advanced · ~24 min
- 05Preconditions on capacity and healthAssertions and guardrails · advanced · ~25 min
- 06Guardrails operators will not bypassAssertions and guardrails · advanced · ~22 min
Part XXV
Check Mode, Diff and Static Validation
What --check proves and what it cannot, --diff and secret exposure, syntax-check and ansible-lint.
- 01The cheapest gates: syntax and listingCheck mode, diff and static validation · intermediate · ~24 min
- 02ansible-lint on an existing repositoryCheck mode, diff and static validation · intermediate · ~24 min
- 03How check mode worksCheck mode, diff and static validation · intermediate · ~22 min
- 04What a clean --check does not proveCheck mode, diff and static validation · advanced · ~24 min
- 05Designing a play whose dry run is informativeCheck mode, diff and static validation · advanced · ~24 min
- 06--diff and what it printsCheck mode, diff and static validation · advanced · ~22 min
- 07The sequence before a production runCheck mode, diff and static validation · advanced · ~24 min
Part XXVI
Testing Automation
The layered testing model, Molecule scenarios, and container versus VM fidelity.
- 01The layered testing model: what each rung actually provesTesting automation · intermediate · ~24 min
- 02The second run is a testTesting automation · intermediate · ~20 min
- 03Where container fidelity stopsTesting automation · intermediate · ~22 min
- 04Molecule: a first scenarioTesting automation · intermediate · ~24 minLab
- 05One role, three distributionsTesting automation · intermediate · ~20 minLab
- 06Verify the outcome, not the task resultTesting automation · intermediate · ~22 min
- 07Staging that is worth havingTesting automation · advanced · ~21 min
- 08What you cannot test before productionTesting automation · advanced · ~20 min
Part XXVII
Collections, Galaxy and Dependency Trust
Namespaces, requirements files, version pinning, and evaluating third-party automation before running it.
- 01Collections, namespaces and the FQCNCollections and dependency trust · intermediate · ~18 min
- 02Proving which artefact you installedCollections and dependency trust · intermediate · ~17 min
- 03Where collections live and which copy winsCollections and dependency trust · intermediate · ~19 min
- 04requirements.yml and version pinningCollections and dependency trust · intermediate · ~21 min
- 05Reading a collection before you run itCollections and dependency trust · advanced · ~24 min
- 06Checksums, GPG signatures and what they proveCollections and dependency trust · advanced · ~20 min
- 07Private Galaxy, mirrors and air-gapped installCollections and dependency trust · advanced · ~21 min
- 08Shipping your own internal collectionCollections and dependency trust · advanced · ~22 min
Part XXVIII
Plugins, Lookups and Filters
The plugin architecture, controller-side lookup execution, and readable filter usage.
- 01The plugin types and how they loadPlugins, lookups and filters · intermediate · ~19 min
- 02Lookups execute on the controllerPlugins, lookups and filters · intermediate · ~20 min
- 03lookup, query and loopsPlugins, lookups and filters · intermediate · ~17 min
- 04Lookups that touch secretsPlugins, lookups and filters · advanced · ~21 min
- 05Filters that make data readablePlugins, lookups and filters · intermediate · ~22 min
- 06Jinja tests and conditionals that fail safePlugins, lookups and filters · intermediate · ~20 min
- 07Callback plugins and run outputPlugins, lookups and filters · intermediate · ~19 min
- 08Writing a filter plugin (and when not to)Plugins, lookups and filters · advanced · ~22 min
Part XXIX
Dynamic Inventory
Inventory plugins, caching, authentication, staleness, and the risk of newly appearing hosts.
- 01Inventory plugins, not inventory scriptsDynamic inventory foundations · advanced · ~22 min
- 02Building and proving a dynamic sourceDynamic inventory foundations · intermediate · ~24 min
- 03Turning provider metadata into targetable groupsDynamic inventory foundations · intermediate · ~26 min
- 04Inventory caching and stalenessOperating a dynamic source · advanced · ~24 min
- 05Authenticating an inventory sourceOperating a dynamic source · advanced · ~23 min
- 06When new hosts appear on their ownOperating a dynamic source · advanced · ~28 min
- 07Merging static and dynamic inventoryOperating a dynamic source · advanced · ~25 min
- 08When the inventory source failsOperating a dynamic source · advanced · ~26 min
Part XXX
Host Targeting and Blast Radius
Host patterns, --limit, verifying the effective host list, and blast radius as a design constraint.
- 01Blast radius as a design constraintBlast radius · intermediate · ~22 min
- 02Host pattern syntaxPatterns · intermediate · ~28 min
- 03How Ansible evaluates a patternPatterns · intermediate · ~21 min
- 04--limit and limit filesNarrowing a run · intermediate · ~26 min
- 05Verifying the effective host list before you runNarrowing a run · intermediate · ~27 min
- 06Zero hosts: warning or errorNarrowing a run · intermediate · ~24 min
- 07ansible_play_hosts, ansible_play_batch and friendsScope from inside the play · advanced · ~24 min
- 08Guardrails: refusing to run too wideScope from inside the play · advanced · ~30 min
Part XXXI
Serial Execution and Failure Tolerance
serial batches, max_fail_percentage, any_errors_fatal, and stopping a rollout before it becomes an outage.
- 01serial: batching a playSerial Execution · advanced · ~24 min
- 02Handlers flush per batchSerial Execution · advanced · ~20 min
- 03max_fail_percentage, preciselyFailure Tolerance · advanced · ~26 min
- 04any_errors_fatal and what fatal meansFailure Tolerance · advanced · ~23 min
- 05Choosing a failure policyFailure Tolerance · advanced · ~22 min
- 06Unreachable is not failedFailure Tolerance · advanced · ~24 min
- 07Ending a batch or a play deliberatelyFailure Tolerance · advanced · ~22 min
- 08Stopping a rollout at 02:00Failure Tolerance · advanced · ~25 min
Part XXXII
Rolling Deployments
Drain, deploy, health-check and return-to-service, built from serial, delegation and wait_for.
- 01The shape of a rolling deploymentRolling Deployments · advanced · ~22 min
- 02Draining a host from the load balancerRolling Deployments · advanced · ~24 min
- 03Health checks that actually assert somethingRolling Deployments · advanced · ~26 min
- 04Restart, reload and handler timingRolling Deployments · advanced · ~22 min
- 05Return to service and the soak intervalRolling Deployments · advanced · ~23 min
- 06When the rollout fails halfwayRolling Deployments · expert · ~27 min
- 07Version skew: what must be true to roll at allRolling Deployments · expert · ~25 min
- 08The complete rolling playbookRolling Deployments · expert · ~28 minLab
Part XXXIII
Delegation and Controller-Side Execution
delegate_to, run_once, local actions, and knowing which machine a task actually runs on.
- 01Which machine does this task run on?Delegation and controller-side execution · advanced · ~22 min
- 02delegate_to and the variables that follow itDelegation and controller-side execution · advanced · ~26 min
- 03delegate_facts: whose facts are these?Delegation and controller-side execution · advanced · ~24 min
- 04Four ways to run something locallyDelegation and controller-side execution · advanced · ~25 min
- 05run_once means once per batchDelegation and controller-side execution · advanced · ~28 min
- 06Making "exactly once" actually mean onceDelegation and controller-side execution · advanced · ~26 min
- 07Delegating to a host that is not in inventoryDelegation and controller-side execution · advanced · ~24 min
Part XXXIV
Concurrency, Strategies and Performance
forks, linear versus free, pipelining, fact caching, and measuring before tuning.
- 01Measure first, tune secondConcurrency, strategies and performance · advanced · ~26 min
- 02forks and the controller real limitsConcurrency, strategies and performance · advanced · ~27 min
- 03linear, free and host_pinnedConcurrency, strategies and performance · advanced · ~25 min
- 04throttle: protecting shared dependenciesConcurrency, strategies and performance · intermediate · ~22 min
- 05Pipelining, ControlPersist and connection costConcurrency, strategies and performance · advanced · ~26 min
- 06Fact gathering is usually the billConcurrency, strategies and performance · advanced · ~25 min
- 07Fact caching and the risk of stale factsConcurrency, strategies and performance · advanced · ~26 min
Part XXXV
Large Fleet Architecture
Waves, scheduling, controller placement, and the operational shape of automation at thousands of hosts.
- 01Waves: ordering a fleet by consequenceLarge fleet architecture · advanced · ~22 min
- 02Inventory structure that survives growthLarge fleet architecture · advanced · ~23 min
- 03Where the controller livesLarge fleet architecture · advanced · ~24 min
- 04Scheduling and the thundering herdLarge fleet architecture · advanced · ~22 min
- 05Partitioning a run so it can be resumedLarge fleet architecture · advanced · ~24 min
- 06Inventory performance and truth at scaleLarge fleet architecture · advanced · ~23 min
- 07Estimating runtime before you commit to a windowLarge fleet architecture · advanced · ~22 min
Part XXXVI
Drift and Convergence
Detecting drift, remediating it, recording intentional exceptions, and avoiding snowflake automation.
- 01Drift, and what convergence actually meansDrift and convergence · intermediate · ~20 min
- 02Check mode as a drift detectorDrift and convergence · intermediate · ~22 min
- 03What check mode cannot tell youDrift and convergence · advanced · ~24 min
- 04Reading diff output properlyDrift and convergence · advanced · ~21 min
- 05Detect, decide, enforceDrift and convergence · advanced · ~24 min
- 06Recording an approved deviationDrift and convergence · advanced · ~23 min
- 07Snowflakes and the uniqueness budgetDrift and convergence · advanced · ~22 min
Part XXXVII
Environments and Repository Architecture
Environment separation, directory layout, promotion models, and a reference production repository.
- 01Environments are inventories, not variablesEnvironments and repository layout · advanced · ~18 min
- 02The reference repository layoutEnvironments and repository layout · advanced · ~22 min
- 03Layering group_vars across environmentsEnvironments and repository layout · intermediate · ~19 min
- 04One role, many environmentsEnvironments and repository layout · intermediate · ~20 min
- 05Promoting a change from development to productionEnvironments and repository layout · advanced · ~20 min
- 06Secrets separated by environmentEnvironments and repository layout · advanced · ~20 min
- 07Conventions, ownership and the 03:00 READMEEnvironments and repository layout · intermediate · ~18 min
Part XXXVIII
Git Workflow and CI for Ansible
Automation as production code: review, protected branches, lint, syntax, secret scanning and integration tests.
- 01This repository can take down the fleetAutomation as production code · intermediate · ~19 min
- 02Branch protection and what production runs fromAutomation as production code · advanced · ~18 min
- 03Syntax check, yamllint and ansible-lint as CI stagesAutomation as production code · intermediate · ~21 min
- 04Keeping secrets out of the repositoryAutomation as production code · advanced · ~20 min
- 05Check mode as a merge gateAutomation as production code · advanced · ~20 min
- 06Role testing with Molecule in the pipelineAutomation as production code · advanced · ~21 minLab
- 07The complete pipelineAutomation as production code · advanced · ~22 min
Part XXXIX
Automation Platforms, RBAC and Event-Driven
AWX and Automation Controller concepts, RBAC, schedules, workflows and event-driven automation safety.
- 01What a platform adds over the command lineAutomation platforms, RBAC and event-driven automation · intermediate · ~24 min
- 02Projects, inventories, credentials, job templatesAutomation platforms, RBAC and event-driven automation · advanced · ~26 min
- 03RBAC as a blast-radius controlAutomation platforms, RBAC and event-driven automation · advanced · ~28 min
- 04Credentials the operator never seesAutomation platforms, RBAC and event-driven automation · advanced · ~26 min
- 05Schedules, workflows and unattended runsAutomation platforms, RBAC and event-driven automation · advanced · ~28 min
- 06Event-driven Ansible: sources, rules, actionsAutomation platforms, RBAC and event-driven automation · advanced · ~26 min
- 07Automated response without automating the outageAutomation platforms, RBAC and event-driven automation · advanced · ~30 min
Part XL
Patch and Reboot Management
Controlled fleet patching, reboot detection and recovery, and rolling kernel upgrades.
- 01Sizing the patch run before you write itPatch and Reboot Management · advanced · ~24 min
- 02Patching Debian and UbuntuPatch and Reboot Management · advanced · ~26 min
- 03Patching RHEL, Rocky and AlmaPatch and Reboot Management · advanced · ~26 min
- 04The package module and the portability trapPatch and Reboot Management · advanced · ~22 min
- 05Deciding whether a reboot is requiredPatch and Reboot Management · advanced · ~25 min
- 06The reboot module actual contractPatch and Reboot Management · advanced · ~26 minLab
- 07Proving a host came back, not just answeredPatch and Reboot Management · advanced · ~27 minLab
- 08Rolling kernel upgrades across a fleetPatch and Reboot Management · expert · ~28 minLab
Part XLI
Service and Application Deployment
Package, configure, validate, health-check, and the extra caution database automation requires.
- 01What deploy means to a convergent toolService and Application Deployment · intermediate · ~23 min
- 02Service state, enablement and restart disciplineService and Application Deployment · advanced · ~24 min
- 03Validating configuration before it can break a serviceService and Application Deployment · advanced · ~24 min
- 04Health gates that actually gateService and Application Deployment · advanced · ~25 min
- 05Rolling a deployment through a load balancerService and Application Deployment · advanced · ~26 minLab
- 06Deploying a version, not latestService and Application Deployment · intermediate · ~24 min
- 07Why databases get different rulesService and Application Deployment · expert · ~28 min
- 08The limits of Ansible as a deployment toolService and Application Deployment · expert · ~25 min
Part XLII
Ansible Beyond Linux Servers
Network devices, cloud APIs, Terraform hand-off, Docker hosts and Proxmox, with clear tool boundaries.
- 01Why network modules run on the controllerBeyond Linux servers · advanced · ~26 min
- 02Changing a device you are connected throughBeyond Linux servers · expert · ~28 min
- 03Automating APIs instead of hostsBeyond Linux servers · advanced · ~27 min
- 04Ansible and Docker hosts: drawing the lineBeyond Linux servers · advanced · ~26 min
- 05Ansible and Proxmox VE: drawing the lineBeyond Linux servers · advanced · ~27 min
- 06Provisioning versus configurationBeyond Linux servers · advanced · ~26 min
- 07A decision table for mixed estatesBeyond Linux servers · advanced · ~24 min
Part XLIII
Observability and Auditing of Automation
Callback output, run metrics, audit trails, and answering who changed three hundred servers.
- 01Reading a PLAY RECAP like an operatorObservability and auditing · intermediate · ~26 min
- 02Changing what a run tells youObservability and auditing · intermediate · ~25 min
- 03The controller log nobody turned onObservability and auditing · advanced · ~25 min
- 04Machine-readable run artefactsObservability and auditing · advanced · ~26 min
- 05"Who changed three hundred servers?"Observability and auditing · advanced · ~28 min
- 06Metrics that predict an automation failureObservability and auditing · advanced · ~27 min
- 07Reporting outward without making it mandatoryObservability and auditing · advanced · ~25 min
Part XLIV
Failure Modes and Partial Fleet Failure
failed, unreachable, skipped and rescued; and judging whether a partial success is a failed change.
- 01The seven things that can happen to a hostFailure Modes and Partial Fleet Failure · advanced · ~22 min
- 02Three hundred hosts, two hundred and twenty successesFailure Modes and Partial Fleet Failure · advanced · ~26 min
- 03Why unreachable hosts are the dangerous onesFailure Modes and Partial Fleet Failure · advanced · ~25 min
- 04When the connection dies mid-taskFailure Modes and Partial Fleet Failure · expert · ~26 min
- 05Fighting the automatic updater for the package lockFailure Modes and Partial Fleet Failure · advanced · ~24 min
- 06Is it safe to run it again?Failure Modes and Partial Fleet Failure · advanced · ~26 min
- 07Retry, roll back, quarantine or investigateFailure Modes and Partial Fleet Failure · expert · ~27 min
- 08Stopping a bad change at host twelveFailure Modes and Partial Fleet Failure · expert · ~26 min
Part XLV
Debugging and Troubleshooting
Verbosity levels, variable and inventory inspection, Jinja errors, SSH and sudo faults, without leaking secrets.
- 01Verbosity is a disclosure decisionDebugging and Troubleshooting · advanced · ~24 min
- 02Proving which hosts you are about to touchDebugging and Troubleshooting · intermediate · ~22 min
- 03Finding out which variable wonDebugging and Troubleshooting · advanced · ~25 min
- 04Reading Jinja and templating errorsDebugging and Troubleshooting · advanced · ~25 min
- 05Diagnosing transport failuresDebugging and Troubleshooting · advanced · ~26 min
- 06Diagnosing privilege escalation failuresDebugging and Troubleshooting · advanced · ~24 min
- 07Reducing three hundred hosts to one reproductionDebugging and Troubleshooting · advanced · ~25 min
Part XLVI
Python and Interpreter Discovery
Remote Python requirements, interpreter discovery, minimal hosts, raw bootstrapping and Windows in brief.
- 01What actually runs on a managed nodeRemote Python and interpreter discovery · intermediate · ~20 min
- 02How Ansible chooses a PythonRemote Python and interpreter discovery · advanced · ~22 min
- 03Pinning the interpreter as a production decisionRemote Python and interpreter discovery · intermediate · ~20 min
- 04Bootstrapping a host with no PythonRemote Python and interpreter discovery · advanced · ~22 min
- 05Targets that cannot run PythonRemote Python and interpreter discovery · advanced · ~18 min
- 06Windows in brief, and why it is differentRemote Python and interpreter discovery · intermediate · ~20 min
Part XLVII
Controller Security
Hardening the controller, SSH key management and rotation, and why controller compromise is fleet compromise.
- 01Controller compromise is fleet compromiseController security · intermediate · ~18 min
- 02Building a controller worth trustingController security · advanced · ~22 min
- 03Who is allowed to run whatController security · advanced · ~22 min
- 04Keys that are only good for automationController security · advanced · ~24 min
- 05Rotating a key across a fleet without locking yourself outController security · expert · ~26 min
- 06Vault identity custody and rotationController security · advanced · ~22 min
- 07Every collection you install runs as root everywhereController security · advanced · ~22 min
Part XLVIII
Maintenance Windows and Rollback
Change windows, rollback patterns Ansible does not give you for free, and backups worth having.
- 01Ansible has no undoMaintenance windows and rollback · advanced · ~26 min
- 02The reverse is part of the changeMaintenance windows and rollback · advanced · ~26 min
- 03A catalogue of rollback patterns, and what each is forMaintenance windows and rollback · advanced · ~30 min
- 04Running the windowMaintenance windows and rollback · advanced · ~28 min
- 05Canary first, with criteria written downMaintenance windows and rollback · advanced · ~28 min
- 06A backup you have not restored is a hypothesisMaintenance windows and rollback · advanced · ~28 min
- 07Reconciling a fleet after a partial rollbackMaintenance windows and rollback · expert · ~30 min
Part XLIX
Compliance, Validation and Certificates
Audit versus enforce, infrastructure testing, health checks, certificate deployment and secret rotation.
- 01Reporting drift versus correcting itCompliance, validation and certificates · advanced · ~28 min
- 02What check mode actually proves in an auditCompliance, validation and certificates · expert · ~28 min
- 03Producing evidence an auditor can readCompliance, validation and certificates · advanced · ~28 min
- 04Validation plays that fail loudlyCompliance, validation and certificates · advanced · ~30 min
- 05Certificates, end to endCompliance, validation and certificates · advanced · ~30 min
- 06Rotating a secret across three hundred hostsCompliance, validation and certificates · expert · ~30 min
- 07Compliance on a schedule, read by someoneCompliance, validation and certificates · expert · ~28 min
Part L
Automation Disaster Recovery
Rebuilding a lost controller, pinned reproducible environments, and execution environments.
- 01The controller is permanently lostWhat the controller actually held · advanced · ~26 min
- 02What belongs in the repository, and what must notWhat the controller actually held · advanced · ~30 min
- 03A controller you can rebuild byte-for-byte enoughMaking the rebuild possible · advanced · ~32 min
- 04Backing up the things you must not lose or leakMaking the rebuild possible · expert · ~30 min
- 05Execution environments as a reproducibility answerMaking the rebuild possible · advanced · ~30 min
- 06The timed rebuild drillProving the rebuild works · expert · ~28 minLab
Part LI
Custom Modules and Tool Selection
When a custom module is justified, and when Ansible is the wrong tool entirely.
- 01Exhaust the alternatives firstDeciding to write code · advanced · ~28 min
- 02Writing a module that behaves like a real oneWriting and shipping a module · expert · ~34 min
- 03The contract a module owes its usersWriting and shipping a module · expert · ~30 min
- 04Testing it, then shipping it properlyWriting and shipping a module · expert · ~32 min
- 05Filter, lookup, module or action pluginChoosing the right tool · advanced · ~28 min
- 06When Ansible is the wrong toolChoosing the right tool · advanced · ~30 min
Part LII
Anti-Patterns
The recurring failure shapes: shell everywhere, secrets in Git, no limit, no canary, no rollback.
- 01Anti-pattern: shell everywhereAnti-patterns of construction · intermediate · ~26 min
- 02Anti-pattern: secrets in GitAnti-patterns of construction · advanced · ~28 min
- 03Anti-pattern: no limit, no canaryAnti-patterns of execution · advanced · ~26 min
- 04Anti-pattern: ignore_errors as a green-build buttonAnti-patterns of execution · intermediate · ~26 min
- 05Anti-pattern: tasks that always change, or never doAnti-patterns of reporting · intermediate · ~26 min
- 06Anti-pattern: encoding the inventory in whenAnti-patterns of reporting · intermediate · ~28 min
- 07Anti-pattern: latest everywhereAnti-patterns of neglect · intermediate · ~26 min
- 08Anti-pattern: automation nobody tests, and automation nobody dares runAnti-patterns of neglect · advanced · ~30 min
Part LIII
Labs
Hands-on exercises against disposable controller and managed-node topologies.
No lessons published in this part yet. The full curriculum is planned in docs/courses/ansible/curriculum.md on GitHub.
Part LIV
Runbooks
Step-by-step operational procedures for running and recovering Ansible automation.
Part LV
Checklists
Pre-execution, production change, patching and security review checklists.
Part LVI
Break/Fix Scenarios
Deliberate automation incidents diagnosed from evidence.
Part LVII
Capstone
A complete production Ansible estate, operated end to end.
No lessons published in this part yet. The full curriculum is planned in docs/courses/ansible/curriculum.md on GitHub.
Part ansible-final
Final Assessment
Practical assessment of a deliberately flawed Ansible repository.
No lessons published in this part yet. The full curriculum is planned in docs/courses/ansible/curriculum.md on GitHub.