如何通过bash脚本检测EC2实例是否已准备好接受SSH连接
EC2 SSH就绪检测实现方案
你可以在原有的实例运行状态检测逻辑后新增SSH连通性校验环节,即可解决实例running但SSH未就绪的问题,具体实现如下:
完整修改后的脚本逻辑
# 原有实例运行状态检测逻辑 while [ "$ec2_instance_status" != '"running"' ]; do echo "=======instance state - $ec2_instance_status=======" sleep 10 ec2_instance_status=$(aws --region=ap-southeast-2 --profile=prod ec2 describe-instance-status --instance-ids $instance_id | jq ".InstanceStatuses[0].InstanceState.Name") done # 新增步骤1:获取EC2实例的公网IP(如果用内网连接替换为PrivateIpAddress即可) ec2_public_ip=$(aws --region=ap-southeast-2 --profile=prod ec2 describe-instances --instance-ids $instance_id | jq -r ".Reservations[0].Instances[0].PublicIpAddress") # 新增步骤2:SSH就绪检测,设置最大重试次数避免无限等待 max_retry=15 retry_count=0 ssh_ready=0 ssh_user="你的EC2登录用户名" # 比如ec2-user、ubuntu等 while [ $retry_count -lt $max_retry ]; do # 检测方式1:用nc检测22端口是否开放,轻量无需认证 if nc -z -w 5 $ec2_public_ip 22; then ssh_ready=1 break fi # 可选检测方式2:直接用SSH做空命令探测,验证SSH服务可正常响应认证,更准确 # if ssh -o ConnectTimeout=5 -o StrictHostKeyChecking=no $ssh_user@$ec2_public_ip 'exit 0' > /dev/null 2>&1; then # ssh_ready=1 # break # fi echo "=======SSH not ready, retry $((retry_count+1))/$max_retry=======" sleep 10 retry_count=$((retry_count+1)) done if [ $ssh_ready -eq 0 ]; then echo "=======SSH connection failed after $max_retry retries, exit=======" exit 1 fi # 后续执行ansible等任务逻辑
关键说明
- 两种检测方式按需选择:仅确认端口连通选nc方案,需要确认SSH服务完全可用选SSH探测方案
max_retry和等待时长可按需调整,上述配置默认最长等待2.5分钟,足够覆盖EC2初始化耗时- 运行脚本的机器需要提前安装nc或者ssh客户端,且EC2安全组已放通该机器的22端口入站权限
内容的提问来源于stack exchange,提问作者Harshit
相关产品推荐
相关产品推荐

