通过这个循环,我们在所有服务器(服务器列表= consul members | grep awk {'print $2'} | cut -d ":" -f1
)上顺序更新包consul
。
for i in $(consul members | grep awk {'print $2'} | cut -d ":" -f1) ; do sshpass -p $PASSWORD ssh -oStrictHostKeyChecking=no -q root@$i "hostname && yum clean all && yum -y update consul && systemctl restart consul.service" ; done
我们有超过1000台服务器,所以我们希望运行sshpass
在 10 台服务器上并行运行。我发现GNU 并行为了这个任务。
如何使用它sshpass
并确保没有服务器(服务器列表)完成两次?
答案1
确实,pssh
听起来是更好的解决方案。如果必须使用parallel
它应该相当简单:将每行一个主机名通过管道传输到用作{}
占位符的单个命令中。例如:
consul members | ... awk {'print $2'} | cut -d ":" -f1 |
parallel -j 10 sshpass -p "$PASSWORD" ssh -oStrictHostKeyChecking=no -q root@{} "hostname && yum clean all && yum -y update consul && systemctl restart consul.service"
使用sshpass
应该不会有任何区别。首先使用简单的命令(例如 just )对其进行测试hostname
。
答案2
使用 pssh 和 ssh 主机密钥身份验证效果更好
首先,在本地机器上,作为要连接的用户,执行 ssh-keygen 创建公钥
然后使用 ssh-copy-id 将该公钥复制到所有远程服务器。然后做一些类似的事情:
pssh -h <(consul members | grep awk {'print $2'} | cut -d ":" -f1) -o /tmp/update-consul-servers -i "yum clean all && yum -y update consul && systemctl restart consul.service"
答案3
所有,这是在脚本中提示密码的工作 shell,执行 require 命令并列出哪些服务器未经过身份验证。
对于我在cat /root/fahmi/up.list
;
做如果! sshpass -p '密码' ssh -n -T -o StrictHostKeyChecking=无用户@"$i";然后 echo "服务器 $i 无法访问"; fi sshpass -p '密码' ssh -T -o StrictHostKeyChecking=无用户@"$i" <./command.sh
完毕