Skip to main content

aar-doc - Automated Ansible Role Documentation

aar-doc is a tool for generating documentation and defaults automatically from an Ansible role's metadata. Specifically, it reads the meta/main.yml and meta/argument_specs.yml files.

This is heavily inspired by terraform-docs which does a similar thing with Terraform modules. aar-doc isn't nearly as featureful though, but should do the trick!

For instance, the only output format supported is Markdown. As with terraform-docs, you are able to override the default template however. As Ansible users are familiar with Jinja2 aar-doc uses it for templating.

Contributions are welcome to add support for more output formats!

Installation

As aar-doc is a Python utility and exists on PyPI , the usual pip install works:

pip install aar-doc

Usage

 Usage: aar-doc [OPTIONS] ROLE_PATH COMMAND [ARGS]...

 A tool for generating docs for Ansible roles.

╭─ Arguments ──────────────────────────────────────────────────────────────────╮
│ *    role_path      DIRECTORY  Path to an Ansible role [default: None]       │
│                                [required]                                    │
╰──────────────────────────────────────────────────────────────────────────────╯
╭─ Options ────────────────────────────────────────────────────────────────────╮
│ --config-file               FILE              [default: .aar_doc.yml]        │
│ --output-file               FILE              [default: README.md]           │
│ --output-template           TEXT              Output template as a string or │
│                                               a path to a file.              │
│                                               [default: <!--                 │
│                                               BEGIN_ANSIBLE_DOCS -->         │
│                                               {{ content }}                  │
│                                               <!-- END_ANSIBLE_DOCS -->      │
│                                               ]                              │
│ --output-mode               [inject|replace]  [default: inject]              │
│ --install-completion                          Install completion for the     │
│                                               current shell.                 │
│ --show-completion                             Show completion for the        │
│                                               current shell, to copy it or   │
│                                               customize the installation.    │
│ --help                                        Show this message and exit.    │
╰──────────────────────────────────────────────────────────────────────────────╯
╭─ Commands ───────────────────────────────────────────────────────────────────╮
│ defaults   Command for generating role defaults.                             │
│ markdown   Command for generating role documentation in Markdown format.     │
╰──────────────────────────────────────────────────────────────────────────────╯

Configuration

The configuration options can be provided either via CLI arguments shown in --help, or a --config-file in YAML format. Note that the options have underscores when provided via the configuration file.

Examples:

aar-doc --output-file ROLE.md --output-mode replace ...
---
output_file: ROLE.md
output_mode: replace

Defaults

The defaults are written to the defaults/main.yml file in your provided role.

If you want to write them to a different file under defaults/ you can specify that file via the --output-file option.

If your argument_specs contains an option with a default value multiple times, it will use the first found value and description by default. If you want the value and description to be overwritten, you can use the --overwrite-duplicates option.

Markdown

Modes

The inject mode will inject only the changed content in between the BEGIN_ANSIBLE_DOCS and END_ANSIBLE_DOCS markers. This makes it possible to have header and footer text in the file that is not touched. This is the default mode, and will revert to replace if the file does not exist to create it the first time.

The replace mode will replace the whole file with the template. Usually, the inject mode should be fine for regular usage and changing the mode is not necessary unless you want to overwrite an existing file.

Templating

You can override the --output-template used for rendering the document. This may be passed in as a string containing Jinja2, or a path to a file. As noted above, this option may be passed in via CLI or the configuration file.

In the configuration file, easiest is to do a multiline string:

---
output_template: |
  <!-- BEGIN_ANSIBLE_DOCS -->

  This is my role: {{ role }}

  <!-- END_ANSIBLE_DOCS -->

As noted above, the template must start and end with the markers as comments, for the content injection to work.

{{ content }} will contain the rendered builtin output specific template content. For Markdown, see templates/markdown.j2.

You will most likely want to skip using it in your own template however, and use the provided variables containing the role metadata and argument specs directly. aar-doc does not manipulate the values coming in from the YAML files in any way.

Template variables:

  • role: The role name
  • content: Whole content as pre-rendered by the built in templates
  • metadata: Metadata read from meta/main.yml
  • argument_specs: Metadata read from meta/argument_specs.yml

Example:

<!-- BEGIN_ANSIBLE_DOCS -->

This is my role: {{ role }}

<!-- 'metadata' contains all the things in meta/main.yml -->
{{ metadata.galaxy_info.license }}

<!-- All the usual Jinja2 filters are available -->
{{ metadata.galaxy_info.galaxy_tags | sort }}

<!-- Including files is also possible in relation to the role's directory with Jinja2's include directive -->
{% include "defaults/main.yml" %}

<!-- 'argument_specs' contains all the things in meta/argument_specs.yml -->
{% for entrypoint, specs in argument_specs | items %}
Task file name: {{ entrypoint }}.yml has {{ specs | length }} input variables!
{% endfor %}
<!-- END_ANSIBLE_DOCS -->
aar-doc --output-template ./path/to/template.j2 ...

More examples can be found in the tests.

License

MIT

Development

Example VSCode settings.json

{
  "python.testing.pytestArgs": ["tests"],
  "python.testing.unittestEnabled": false,
  "python.testing.pytestEnabled": true
}

Aknowledgements

Metadata

Release files for aar-doc 2.4.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for aar-doc 2.4.0
File Size Uploaded
aar_doc-2.4.0.tar.gz 13.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for aar-doc 2.4.0
File Interpreter ABI Platform
aar_doc-2.4.0-py3-none-any.whl Python 3 none any Details

Total release size: 27.1 kB

Release files / aar_doc-2.4.0.tar.gz

Download URL aar_doc-2.4.0.tar.gz
Size 13.3 kB
Tags Source
SHA-256 checksum
How to use checksums
d962d912ff49cd4c82b39fb5f43090a2828d3a9367d320b13acbcb664bbb50d6
BLAKE2b-256 checksum
How to use checksums
671751f0b3612a9700187349d07caa3a94d331cbf5affcac2714ec4dfcaee230
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 2, 2026.

Transparency log

Release files / aar_doc-2.4.0-py3-none-any.whl

Download URL aar_doc-2.4.0-py3-none-any.whl
Size 13.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
bfb8c9391a376d07d15702232d4da959aeb971b12ee0cc2b64029ec2dfd0fa60
BLAKE2b-256 checksum
How to use checksums
6c9de92d6454010074205dfb6c0340c9918ccb85b1dbc001f4280bc5a9057be9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 2, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

2.4.0 This release

2 release files

2.3.0

2 release files

2.2.0

2 release files

2.1.0

2 release files

2.0.1

2 release files

2.0.0

2 release files

1.2.0

2 release files

1.1.0

2 release files

1.0.4

2 release files

1.0.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page