GNU Parallel 和 sshpass 与循环中的服务器列表

GNU Parallel 和 sshpass 与循环中的服务器列表

通过这个循环,我们在所有服务器(服务器列表= 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

完毕

相关内容