Waiting for Servers to be Provisioned and Ready
Overview
Often when working with automated deployments you will want to wait for your servers to be provisioned and ready before running your Ansible playbook. This is a simple bash script you can run before your Ansible playbook to wait for your servers to be ready.
The Script
The script below assumes a few things, namely:
- You have a private key file called
private.key
in the root directory of your project - You have a terraform directory in the root of your project
- You have two IP address outputs in your terraform called
server-1-ip-address
andserver-2-ip-address
bash
# Simple script to wait till all the servers are up and running (e.g. not setting up)
echo 'Trying SSH to new instances, checking cloud-init status... (It will say "Connection refused" until it is ready.)'
# 6 retries x 5 seconds each = maximum approx 30 seconds to wait for SSH, then bail.
check_instances() {
echo now checking...
ssh root@"$server_1_ip" -o StrictHostKeyChecking=no -i private.key cloud-init status -w
ssh root@"$server_2_ip" -o StrictHostKeyChecking=no -i private.key cloud-init status -w
}
echo getting hostnames...
# Navigate to terraform directory
cd terraform
server_1_ip="$(terraform output -raw server-1-ip-address)"
server_2_ip="$(terraform output -raw server-2-ip-address)"
# Navigate back to root directory
cd ..
timeout=6
stopwatch=0
until check_instances; do
stopwatch=$((stopwatch+1))
if [[ $stopwatch -ge $timeout ]]; then echo Error: Timed out waiting for instance; exit -1; fi
sleep 5
done