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 awscliorpip install awscli) - Install
jq(yum install jqorapt install jq) - Run
aws configurefirst, 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
--listfor 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 Rajesh Kumar, a DevOps, SRE, DevSecOps, Cloud, and Platform Engineering expert passionate about sharing practical knowledge, real-world experiences, and industry best practices. I have worked at Cotocus and regularly write about technology, travel, investing, health, product reviews, and digital marketing through my various platforms.
I publish technical articles at DevOps School, travel stories at Holiday Landmark, stock market insights at Stocks Mantra, health and fitness guidance at My Medic Plus, product reviews at TrueReviewNow, and SEO and digital marketing strategies at Wizbrand.
Find Trusted Cardiac Hospitals
Compare heart hospitals by city and services โ all in one place.
Explore Hospitals