Below is a simple dynamic inventory Bash script for Ansible that queries all EC2 instances in your AWS account, gets their public IPs, and outputs a valid Ansible inventory.
You just need the AWS CLI installed and properly configured (aws configure
), and the script will work anywhere you have permissions.
Dynamic Ansible Inventory Script for AWS EC2 Public IPs
Save this as ec2_dynamic_inventory.sh
and make it executable (chmod +x ec2_dynamic_inventory.sh
).
#!/bin/bash
# Simple AWS EC2 Dynamic Inventory for Ansible (public IPs)
# Requirements: awscli, jq
REGION="${AWS_REGION:-ap-south-1}"
get_instances() {
aws ec2 describe-instances \
--region "$REGION" \
--filters "Name=instance-state-name,Values=running" \
--query 'Reservations[*].Instances[*].{PublicIp:PublicIpAddress,Name:Tags[?Key==`Name`]|[0].Value,Id:InstanceId}' \
--output json
}
if [[ "$1" == "--list" ]]; then
INSTANCES=$(get_instances)
HOSTS=$(echo "$INSTANCES" | jq -r '.[][] | select(.PublicIp != null) | .PublicIp' | jq -R . | jq -s .)
cat <<EOF
{
"aws_ec2_public": {
"hosts": $HOSTS
}
}
EOF
exit 0
elif [[ "$1" == "--host" ]]; then
# Not needed for most use cases; required by Ansible interface.
echo "{}"
exit 0
else
echo "Usage: $0 --list|--host <hostname>"
exit 1
fi
Code language: PHP (php)
Usage
- Plain text for
-i ./ec2_dynamic_inventory.sh
:./ec2_dynamic_inventory.sh
- JSON for
-i ./ec2_dynamic_inventory.sh --list
(for Ansible dynamic inventory integration):./ec2_dynamic_inventory.sh --list
Requirements
- Install the AWS CLI (
yum install awscli
orpip install awscli
) - Install
jq
(yum install jq
orapt install jq
) - Run
aws configure
first, or ensure AWS credentials are available in your environment.
How It Works
- Lists all running EC2 instances with public IPs in your chosen AWS region.
- Outputs a group called
[aws_ec2_public]
with each instance’s public IP as a host. - Also supports
--list
for JSON output compatible with Ansible’s dynamic inventory system.
Sample Output
Text (INI) output:
[aws_ec2_public]
13.233.139.133
3.7.218.154
...
Code language: CSS (css)
JSON output for --list
:
{
"aws_ec2_public": {
"hosts": [
"13.233.139.133",
"3.7.218.154"
]
}
}
Code language: JSON / JSON with Comments (json)
You can now use this script with Ansible:
ansible -i ./ec2_dynamic_inventory.sh all -m ping
or for playbooks:
ansible-playbook -i ./ec2_dynamic_inventory.sh myplaybook.yml
I’m a DevOps/SRE/DevSecOps/Cloud Expert passionate about sharing knowledge and experiences. I have worked at Cotocus. I share tech blog at DevOps School, travel stories at Holiday Landmark, stock market tips at Stocks Mantra, health and fitness guidance at My Medic Plus, product reviews at TrueReviewNow , and SEO strategies at Wizbrand.
Do you want to learn Quantum Computing?
Please find my social handles as below;
Rajesh Kumar Personal Website
Rajesh Kumar at YOUTUBE
Rajesh Kumar at INSTAGRAM
Rajesh Kumar at X
Rajesh Kumar at FACEBOOK
Rajesh Kumar at LINKEDIN
Rajesh Kumar at WIZBRAND