Inventory Files Explained
An inventory is the list of managed hosts Ansible knows about, along with the groups they belong to and any host- or group-specific variables. Every ansible or ansible-playbook command needs an inventory source, whether that's a simple static file listing hostnames, or a dynamic inventory script that queries AWS, Azure, or a company CMDB in real time; without a defined inventory, Ansible has literally nothing to target.
Cricket analogy: An inventory is like a squad list a selector submits before a series, naming every player and which format (Test, ODI, T20) they're eligible for, so the team management knows exactly who's available.
INI vs YAML Inventory Format
Ansible supports two static inventory formats: the classic INI-style format, which is terse and quick to hand-write for small environments, and YAML format, which is more verbose but nests groups and variables more naturally and is often preferred for larger, version-controlled inventories. Both formats let you organize hosts into named groups using bracket headers (INI) or nested keys (YAML), and both support the special children syntax to build groups of groups.
Cricket analogy: Choosing INI vs YAML inventory is like a scorer choosing between a quick shorthand scoresheet for a club match versus the fully detailed official scorebook required for an international Test.
# inventory/hosts.ini
[webservers]
web1.example.com
web2.example.com ansible_host=10.0.1.12
[dbservers]
db1.example.com ansible_user=postgres
[production:children]
webservers
dbservers
[production:vars]
ansible_python_interpreter=/usr/bin/python3# inventory/hosts.yml
all:
children:
production:
children:
webservers:
hosts:
web1.example.com:
web2.example.com:
ansible_host: 10.0.1.12
dbservers:
hosts:
db1.example.com:
ansible_user: postgres
vars:
ansible_python_interpreter: /usr/bin/python3Groups, Variables, and Nesting
Groups let you target a subset of hosts with a single command or a playbook's hosts: line, and every host or group can carry variables such as ansible_user, ansible_port, or custom application settings like db_name. Ansible also predefines two implicit groups — all, containing every host in the inventory, and ungrouped, containing any host not explicitly assigned to a named group — and it merges variables from multiple sources (group_vars/, host_vars/, inventory-defined vars) using a well-defined precedence order where more specific scopes generally override more general ones.
Cricket analogy: Nested groups are like a cricket board organizing players into state teams nested under zones (North, South) nested under the national pool, letting selectors target 'all South Zone players' in one command.
Dynamic Inventory
Static files work fine for stable environments, but cloud infrastructure changes constantly as autoscaling groups add and remove instances, so Ansible supports dynamic inventory plugins that query a live source at runtime instead of relying on a hand-maintained list. The amazon.aws.aws_ec2 plugin, for example, queries the EC2 API and can auto-generate groups from instance tags, so a newly launched instance tagged Environment=production automatically appears in the production group the next time a playbook runs, with zero manual inventory editing.
Cricket analogy: Dynamic inventory is like a live team-sheet system that auto-updates from the official scoring app the moment a substitute fielder is confirmed, instead of a manager manually retyping the lineup.
You can test how Ansible resolves your inventory before running a playbook with 'ansible-inventory --graph' (shows the group hierarchy as a tree) or 'ansible-inventory --list' (shows the full resolved JSON, including merged variables), which is invaluable for debugging unexpected group membership.
- Inventory defines which hosts Ansible manages and how they're grouped; every run needs one.
- Static inventories can be written in INI or YAML format; both support groups and group-of-groups.
- The 'all' group implicitly contains every host; 'ungrouped' holds hosts with no explicit group.
- Variables can be attached at host, group, or inventory level, with a defined precedence order.
- Dynamic inventory plugins (e.g. amazon.aws.aws_ec2) query live sources like cloud APIs instead of static files.
- Dynamic inventory automatically reflects autoscaling and infrastructure changes with no manual editing.
- 'ansible-inventory --graph' and '--list' are useful commands for debugging inventory resolution.
Practice what you learned
1. What is the primary purpose of an Ansible inventory?
2. Which two static inventory formats does Ansible support?
3. What does the implicit 'all' group contain?
4. Why would a team use dynamic inventory instead of a static file?
5. Which command shows the resolved inventory group hierarchy as a tree?
Was this page helpful?
You May Also Like
What Is Ansible?
Ansible is an open-source, agentless automation tool for configuration management, application deployment, and orchestration, driven by human-readable YAML playbooks.
Installing and Configuring Ansible
Ansible is installed via pip or a system package manager on the control node, then tuned through the layered ansible.cfg configuration file.
Ad-Hoc Commands
Ad-hoc commands run a single Ansible module against a set of hosts directly from the command line, ideal for quick one-off tasks that don't warrant a full playbook.
Agentless Architecture and SSH
Ansible manages remote systems without installing any persistent software on them, relying entirely on existing SSH connectivity and Python for execution.
Related Reading
Related Study Notes in DevOps
Browse all study notesNginx Study Notes
DevOps · 30 topics
DevOpsAdvanced Kubernetes Study Notes
Kubernetes · 30 topics
DevOpsAdvanced Bash Scripting Study Notes
Bash · 30 topics
DevOpsApache Kafka Study Notes
Kafka · 30 topics
DevOpsDocker & Kubernetes Study Notes
YAML · 40 topics
DevOpsCI/CD Tools & Pipelines Study Notes
YAML · 37 topics