EC2实例部署JSPaint及HAProxy负载均衡脚本执行异常排查
问题描述
我编写了一套Bash脚本,计划在两台Ubuntu EC2实例上部署JSPaint,同时在另一台实例部署HAProxy实现负载均衡。但目前仅第一台JSPaint实例部署成功,第二台实例的JSPaint及负载均衡实例的HAProxy均未成功部署,仅手动执行脚本可完成部署。现询问是否是scp/ssh命令写法问题,或是其他原因导致该异常。
JSPaint安装脚本(install.sh)
#installing necessary packages sudo apt update #installing git into instance sudo apt install git -y #curling code to install nodejs packages curl -fsSL https://deb.nodesource.com/setup_19.x | sudo -E bash - &&sudo apt-get install -y nodejs # git cloning jspaint repo git clone https://github.com/1j01/jspaint.git cd jspaint # install node package manager for dependencies npm i # executes dev script defined in package npm run dev
HAProxy负载均衡配置脚本(loadbalancer.sh)
# Installing packages sudo apt update -y # Installing haproxy sudo apt install haproxy -y # Changing configuration file sudo sh -c "cat >> /etc/haproxy/haproxy.cfg << _END_ frontend myfrontend bind 0.0.0.0:1999 default_backend myservers backend myservers server server1 $REMOTE_IP1:1999 server server2 $REMOTE_IP2:1999 _END_" sudo systemctl daemon-reload # Restart haproxy sudo systemctl restart haproxy
文件传输及脚本执行命令
scp -r -o StrictHostKeyChecking=no -i ~/.ssh/$PEM_KEY files ubuntu@REMOTE_IP1:~ scp -r -o StrictHostKeyChecking=no -i ~/.ssh/$PEM_KEY files ubuntu@REMOTE_IP2:~ scp -r -o StrictHostKeyChecking=no -i ~/.ssh/$PEM_KEY files ubuntu@REMOTE_IP_LB:~ ssh -o StrictHostKeyChecking=no -i ~/.ssh/$PEM_KEY ubuntu@$REMOTE_IP1 chmod +x ./files/install.sh ssh -o StrictHostKeyChecking=no -i ~/.ssh/$PEM_KEY ubuntu@$REMOTE_IP2 chmod +x ./files/install.sh ssh -o StrictHostKeyChecking=no -i ~/.ssh/$PEM_KEY ubuntu@$REMOTE_IP_LB chmod +x ./files/loadbalancer.sh ssh -o StrictHostKeyChecking=no -i ~/.ssh/$PEM_KEY ubuntu@$REMOTE_IP1 ./files/install.sh ssh -o StrictHostKeyChecking=no -i ~/.ssh/$PEM_KEY ubuntu@$REMOTE_IP2 ./files/install.sh ssh -o StrictHostKeyChecking=no -i ~/.ssh/$PEM_KEY ubuntu@$REMOTE_IP_LB ./files/loadbalancer.sh
问题排查与修复建议
1. SCP命令的变量引用错误
你的scp命令中,REMOTE_IP1、REMOTE_IP2、REMOTE_IP_LB未加$前缀,变量无法被正确展开,scp会尝试连接名为REMOTE_IP1这类字符串的主机,而非实际的EC2实例IP。这是第二台实例和LB实例脚本传输失败的直接原因之一,需修正为:
scp -r -o StrictHostKeyChecking=no -i ~/.ssh/$PEM_KEY files ubuntu@$REMOTE_IP1:~ scp -r -o StrictHostKeyChecking=no -i ~/.ssh/$PEM_KEY files ubuntu@$REMOTE_IP2:~ scp -r -o StrictHostKeyChecking=no -i ~/.ssh/$PEM_KEY files ubuntu@$REMOTE_IP_LB:~
2. HAProxy脚本的变量传递问题
HAProxy脚本中的$REMOTE_IP1和$REMOTE_IP2是本地变量,远程实例执行脚本时不会自动继承,会被替换为空字符串,导致HAProxy配置文件无效、启动失败。解决方法是执行脚本时将变量传递给远程会话:
ssh -o StrictHostKeyChecking=no -i ~/.ssh/$PEM_KEY ubuntu@$REMOTE_IP_LB "REMOTE_IP1=$REMOTE_IP1 REMOTE_IP2=$REMOTE_IP2 ./files/loadbalancer.sh"
3. 远程执行脚本的错误日志缺失
默认ssh远程执行命令仅返回最终状态,无详细错误输出。可修改执行命令获取详细日志,方便定位问题:
ssh -o StrictHostKeyChecking=no -i ~/.ssh/$PEM_KEY ubuntu@$REMOTE_IP2 "bash -x ./files/install.sh 2>&1" ssh -o StrictHostKeyChecking=no -i ~/.ssh/$PEM_KEY ubuntu@$REMOTE_IP_LB "REMOTE_IP1=$REMOTE_IP1 REMOTE_IP2=$REMOTE_IP2 bash -x ./files/loadbalancer.sh 2>&1"
-x会打印每个执行的命令,2>&1将错误输出重定向到标准输出,便于查看哪一步出错。
4. 脚本执行的环境与权限问题
- 非交互式Shell环境变量:远程执行ssh时默认是非交互式shell,
PATH等环境变量可能与手动登录时不同,比如npm路径可能不在默认PATH中。可在脚本开头添加source ~/.profile或source ~/.bashrc确保环境变量加载。 - 前台进程终止:
npm run dev是前台运行命令,ssh会话关闭后进程会终止。若需长期运行,应改用nohup npm run dev &或配置systemd服务管理JSPaint进程。
5. 脚本错误检查增强
在install.sh和loadbalancer.sh开头添加set -e,让脚本遇到错误时立即停止,避免后续无效命令执行:
set -e
也可为关键命令添加错误检查,例如:
sudo apt update || { echo "apt update失败"; exit 1; } git clone https://github.com/1j01/jspaint.git || { echo "git克隆失败"; exit 1; }
内容的提问来源于stack exchange,提问作者swig
相关产品推荐
相关产品推荐

