Ansible inventory file is a fundamental component of Ansible that defines the hosts (remote systems) that you want to manage and the groups those hosts belong to. The inventory file can be static (a simple text file) or dynamic (generated by a script). It provides Ansible with the information about the remote nodes to communicate with during its operations.
A static inventory file is typically a plain text file (usually named hosts or inventory) and is structured in INI or YAML format. Here are examples of both formats:
# inventory file: hosts
[webservers]
web1.example.com
web2.example.com
[dbservers]
db1.example.com
db2.example.com
[all:vars]
ansible_user=admin
ansible_ssh_private_key_file=/path/to/key
# inventory file: hosts.yaml
all:
vars:
ansible_user: admin
ansible_ssh_private_key_file: /path/to/key
children:
webservers:
hosts:
web1.example.com:
web2.example.com:
dbservers:
hosts:
db1.example.com:
db2.example.com:
A dynamic inventory is generated by a script or plugin and can be used for environments where hosts are constantly changing (e.g., cloud environments). The script or plugin fetches the list of hosts from a source like AWS, GCP, or any other dynamic source.
Here is an example of a dynamic inventory script for AWS EC2:
#!/usr/bin/env python
import json
import boto3
def get_aws_ec2_inventory():
ec2 = boto3.client('ec2')
instances = ec2.describe_instances()
inventory = {
'all': {
'hosts': [],
'vars': {
'ansible_user': 'ec2-user',
'ansible_ssh_private_key_file': '/path/to/key'
}
},
'_meta': {
'hostvars': {}
}
}
for reservation in instances['Reservations']:
for instance in reservation['Instances']:
if instance['State']['Name'] == 'running':
public_ip = instance['PublicIpAddress']
inventory['all']['hosts'].append(public_ip)
inventory['_meta']['hostvars'][public_ip] = {
'ansible_host': public_ip
}
print(json.dumps(inventory, indent=2))
if __name__ == '__main__':
get_aws_ec2_inventory()
ansible-playbook -i inventory <Adhoc command or Playbook.yml>