Introduction
This tutorial will guide you through the process of locating the default Ansible inventory directory, where you can define your hosts and groups for your Ansible deployments. Understanding the inventory directory is crucial for effectively managing your infrastructure with Ansible.
Ansible Inventory Fundamentals
What is Ansible Inventory?
Ansible inventory is a fundamental component of infrastructure automation that defines and organizes target hosts for configuration management and deployment. It serves as a centralized mapping of servers, groups, and their connection parameters.
graph LR
A[Ansible Control Node] --> B[Inventory File]
B --> C[Host Group 1]
B --> D[Host Group 2]
C --> E[Host 1]
C --> F[Host 2]
D --> G[Host 3]
D --> H[Host 4]
Inventory File Types and Formats
Ansible supports multiple inventory file formats:
| Format | Extension | Description |
|---|---|---|
| INI | .ini | Traditional key-value configuration |
| YAML | .yml/.yaml | Structured, human-readable format |
| Dynamic | .py | Programmatically generated inventory |
Basic Inventory Configuration Example
Create a simple inventory file (hosts) on Ubuntu 22.04:
[webservers]
web1 ansible_host=192.168.1.100 ansible_user=ubuntu
web2 ansible_host=192.168.1.101 ansible_user=ubuntu
[databases]
db1 ansible_host=192.168.1.200 ansible_user=ubuntu
Key Inventory Parameters
Inventory files allow specifying critical connection parameters:
ansible_host: Target machine's IP addressansible_user: SSH login usernameansible_port: Custom SSH portansible_ssh_private_key_file: SSH key path
Inventory Variables and Grouping
Ansible inventory enables flexible host organization through variables and nested groups:
[production:children]
webservers
databases
[production:vars]
environment=prod
deployment_region=us-east-1
This structure supports complex infrastructure management with scalable, modular configurations.
Inventory Configuration Techniques
Inventory File Structure and Syntax
Ansible supports multiple inventory configuration techniques to organize and manage infrastructure efficiently. Understanding these techniques enables precise host management and connection settings.
graph LR
A[Inventory Configuration] --> B[Static Inventory]
A --> C[Dynamic Inventory]
B --> D[INI Format]
B --> E[YAML Format]
C --> F[Script-based Inventory]
Static Inventory Configuration
INI-style Inventory
[webservers]
web1 ansible_host=192.168.1.100 ansible_user=ubuntu
web2 ansible_host=192.168.1.101 ansible_user=ubuntu
[databases]
db1 ansible_host=192.168.1.200 ansible_user=ubuntu
[production:children]
webservers
databases
YAML-style Inventory
all:
hosts:
web1:
ansible_host: 192.168.1.100
ansible_user: ubuntu
db1:
ansible_host: 192.168.1.200
ansible_user: ubuntu
children:
webservers:
hosts:
web1:
databases:
hosts:
db1:
Connection Parameters Configuration
| Parameter | Description | Example |
|---|---|---|
| ansible_host | Target machine IP | 192.168.1.100 |
| ansible_user | SSH username | ubuntu |
| ansible_port | Custom SSH port | 22 |
| ansible_ssh_private_key_file | SSH key path | /home/user/.ssh/id_rsa |
Advanced Grouping Techniques
[datacenter:children]
webservers
databases
[datacenter:vars]
ansible_connection=ssh
environment=production
Dynamic Inventory Scripts
Dynamic inventory allows generating host lists programmatically:
#!/usr/bin/env python3
import json
def get_inventory():
return {
'webservers': {
'hosts': ['web1', 'web2'],
'vars': {'http_port': 80}
}
}
print(json.dumps(get_inventory(), indent=2))
This approach provides flexible, automated host management for complex infrastructure environments.
Advanced Inventory Strategies
Dynamic Inventory Management
Dynamic inventory enables automated, scalable infrastructure configuration by generating host lists programmatically.
graph TD
A[Dynamic Inventory Source] --> B[External Script]
B --> C[JSON/YAML Output]
C --> D[Ansible Inventory]
D --> E[Host Provisioning]
Cloud Provider Integration
AWS EC2 Dynamic Inventory
#!/usr/bin/env python3
import boto3
import json
def get_ec2_inventory():
ec2 = boto3.client('ec2')
instances = ec2.describe_instances()
inventory = {
'webservers': {
'hosts': [
instance['PrivateIpAddress']
for reservation in instances['Reservations']
for instance in reservation['Instances']
if instance.get('PrivateIpAddress')
]
}
}
return inventory
print(json.dumps(get_ec2_inventory(), indent=2))
Inventory Plugins
| Plugin Type | Functionality | Use Case |
|---|---|---|
| AWS EC2 | Cloud discovery | Dynamic host provisioning |
| GCP Compute | Google Cloud integration | Automated infrastructure |
| OpenStack | Private cloud management | Scalable deployments |
Inventory Variable Strategies
[webservers:vars]
ansible_python_interpreter=/usr/bin/python3
deploy_environment=production
[databases:vars]
backup_schedule=daily
performance_tier=high
Inventory Filtering and Targeting
## Target specific groups
ansible webservers -m ping
## Filter hosts using patterns
ansible 'webservers:&production' -m command -a 'uptime'
## Exclude specific hosts
ansible 'all:!deprecated' -m setup
Scalable Inventory Configuration
plugin: constructed
strict: false
groups:
web_servers: "'web' in inventory_hostname"
prod_servers: "environment == 'production'"
This approach provides flexible, programmatic infrastructure management across diverse environments.
Summary
In this tutorial, you have learned how to locate the default Ansible inventory directory, configure it, and define your hosts and groups. By understanding the inventory structure, you can efficiently use Ansible to manage your infrastructure and automate your deployments. Following best practices for inventory management will ensure your Ansible workflows are scalable and maintainable.


