100% Free Forever
AI-Powered Learning
Industry Expert Content
Certificates & Badges
Learn At Your Own Pace
DevOps

Inventory Files Explained

An inventory file tells Ansible which hosts exist and how they're grouped, and can be static (INI or YAML) or generated dynamically from a cloud provider or CMDB.

FoundationsBeginner9 min readJul 10, 2026
Analogies

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.

ini
# 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
yaml
# 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/python3

Groups, 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

Was this page helpful?

Topics covered

#DevOps#AnsibleStudyNotes#InventoryFilesExplained#Inventory#Files#Explained#INI#StudyNotes#SkillVeris#ExamPrep