← All TILs · ansible

Targeting hosts the same way, whether the inventory is static or dynamic

ansible - 2026-09-05

The host patterns Ansible accepts on the command line and in a playbook's hosts: line don't care where the hosts came from — a plain INI file, a YAML static inventory, or a dynamic plugin like the Foreman one all get flattened into the same in-memory host/group graph first. Patterns operate on that graph, not on the source file. This is on the current stable stack (ansible-core 2.20, Python 3.12+ on the controller) but the pattern syntax itself hasn't changed in years.

The patterns

ansible all --list-hosts                    # everything
ansible webservers --list-hosts             # one group
ansible web01.example.com --list-hosts      # one host
ansible 'webservers,dbservers' --list-hosts # union (OR) -- comma or colon both work
ansible 'webservers:&datacenter1' --list-hosts   # intersection (AND)
ansible 'webservers:!staging' --list-hosts       # exclusion (NOT)
ansible '*.example.com' --list-hosts             # wildcard
ansible '~(web|db).*\.example\.com' --list-hosts # regex, note the leading ~

--list-hosts just prints who a pattern matches without touching anything — the safest way to sanity-check a pattern before pointing a real playbook run at it.

Limiting at runtime without touching the playbook

A playbook's hosts: all (or hosts: webservers) sets the maximum possible target set; --limit (-l for short) narrows it further at invocation time, no editing required:

ansible-playbook site.yml --limit datacenter2
ansible-playbook site.yml -l 'webservers:&datacenter1'

Same pattern syntax as above works here too. --limit @retry_hosts.txt also accepts a file — the one Ansible itself writes after a failed run (site.retry), for rerunning against just the hosts that failed.

Where this matters most: mixed static + dynamic sources

-i can be passed more than once, or pointed at a directory containing both a static file and a dynamic plugin config side by side:

inventory/
├── static-hosts.ini
└── production.foreman.yml
ansible-playbook site.yml -i inventory/

Ansible merges both sources into one graph before any pattern is applied — a group defined in the static file and a same-named group produced by the Foreman plugin combine, and --limit/hosts: patterns see the union transparently. This is exactly why ansible-inventory --graph (from the Foreman TIL) is worth running whenever mixing sources — it's the only way to see what the combined graph actually looks like, since no single file on disk shows it.

Created 2026-09-05T16:39:00+02:00 · Edit