Ansible earns a place among languages because it forces a question the others do not: what kind of language is a configuration tool? You write YAML that describes a desired end state, not a sequence of steps, and the engine reconciles the machine toward that state. Yet each declarative module is imperative Python underneath, so the declarative surface is a thin skin over ordinary procedural code. That tension, declared intent over imperative mechanism, plus idempotence as the property that makes re-running safe, is what the comparative notes examine.

It is also the section’s control case in the opposite direction from Racket. Ansible has no generics because it has no type system, no functions, and no compile step, so the problem generics solve never arises. The folder says that plainly rather than stretching an analogy, then goes looking for what does the work instead: an implicit loop over hosts, a role with parameters and defaults, and a library of Jinja2 filters that behave like the functions the language refuses to have.

The language surface

What you actually write, and what decides what it means.

The absence, and what stands in for it

The execution model

What actually happens when a play runs, which explains most of the surprises above.

Control flow in a language that claims not to have any

The plugin surface

Ansible is small and its plugin taxonomy is large. This is where the extensibility actually lives.

Secrets, testing, and judgment

Read from the comparative layer

Ansible anchors the configuration-and-tooling end of the Common Concerns cluster:


Any pages placed under this folder are auto-listed below by Quartz.

29 items under this folder.