---
# System prepended metadata

title: Ansible Dynamic Inventory

---

# Ansible Dynamic Inventory

### What is Ansible Dynamic Inventory?

#### Install boto3 and botocore
````yaml=
sudo apt-get install software-properties-common -y
sudo apt-add-repository universe
sudo apt-get update -y
sudo apt-get install python3 -y
sudo apt-get install python3-pip -y
sudo pip install boto3 botocore
````
:mag: boto3 and botocore are prerequisites for Ansible Dynamic inventory ***aws_ec2*** plugin

#### Create a new directory "ansible-dynamic-inv"
````yaml=
mkdir ansible-dynamic-inv && cd ansible-dynamic-inv
````
:mag: This directory will be used to keep all files relevant to dynamic inventory at one place.

#### Copy the Private key from your laptop to Ansible Controller

````yaml=
vi ansible-inv.pem
````

#### Create a new ansible.cfg file for AWS Dynamic Inventory operations

````yaml=
## vi ansible.cfg

[defaults]
remote_user = ec2-user
private_key_file = ansible-inv.pem
# pipelining = True
host_key_checking = False

[inventory]
enable_plugins = aws_ec2
````

#### Create dynamic inventory file with aws_ec2.yaml extension

````yaml=
## vi aws_ec2_1.yaml

--- ## Dynamic inventory file for aws ec2 instances
plugin: aws_ec2
aws_access_key: <your-aws-access-key>
aws_secret_key: <your-aws-secret-key>
aws_secret_token: <your-aws-token>

regions:
  - us-east-1

keyed_groups:
  - key: tags
    prefix: tag
````
:mag: Please note that the file name should end in aws_ec2.[yaml|yml] only. For example: ***my-inv_aws_ec2.yaml***

#### Check / validate your configuration
````yaml=
ansible-inventory -i aws_ec2.yaml --list
ansible-inventory -i aws_ec2.yaml --graph
````

:mag: Now you should be able to run any ansible ad-hoc commands or playbooks against this aws_ec2.yaml inventory file using "-i" flag




#### Additional Dynamic inventory settings (Optional)
````yaml=1
plugin: aws_ec2
regions:
  - us-west-2
filters:
  tag:Name: redacted
  
keyed_groups:
  - key: tags.Name
    prefix: tag_Name

# Following will display IPs instead of hostnames in the output for ansible-inventory command.
hostnames:
  - ip-address # default is hostnames
````

### References
:::warning
- https://www.redhat.com/sysadmin/ansible-provisioning-aws-cloud
- https://docs.ansible.com/ansible/latest/collections/amazon/aws/aws_ec2_inventory.html
- https://docs.ansible.com/ansible/latest/inventory_guide/intro_dynamic_inventory.html
- https://bluexp.netapp.com/blog/aws-cvo-blg-ansible-aws-how-to-automate-anything-in-aws-with-ansible
- https://devopscube.com/setup-ansible-aws-dynamic-inventory/
- https://aws.amazon.com/blogs/apn/getting-started-with-ansible-and-dynamic-amazon-ec2-inventory-management/
:::