引言
如果需要在大量的服务器执行相同的操作,或者是部署分布式应用(elk, k8s, geth等)时,一般的做法是写一个批量操作的本地脚本,依次scp到每一台服务器上,然后ssh到每一台服务器上执行脚本。但如果有上几十台甚至上百台机器呢,或是刚写完一个脚本发下有缺陷,又需要重复的做scp、ssh的工作,在此来说一下我自己批量操作服务器时使用的方法,如果有更好的方法,欢迎指导交流。
一、建立ssh信任关系
由于需要执行ssh和scp命令,必然要涉及到输入服务器密码的操作,或者有的服务器设置中禁用了输入密码的方式登录。虽然可以使用expect脚本来输入密码,但是由于他的实现原理,用一下就知道有多么的操蛋。此时,建立信任关系成了最方便的方法。之前建立好信任关系的可以跳过此章。
ssh-keygen -t rsa
然后查看已经生成的公钥
vim ~/.ssh/id_rsa.pub
把该文件的内容追加到服务器的信任列表中,如果没有这个文件就自行创建
vim /root/.ssh/authorized_keys
好了,接下来我们就可以自由的scp和ssh了。
二、编写服务器需要执行的脚本
假设我们想查看每一台服务器的磁盘使用情况
cd /tmp
echo df > df.sh
三、编写批量操作脚本
cat > /tmp/sshall.sh << EOF
#!/bin/bash
#Server list
iplist=(
103.235.247.111
101.207.224.222
107.155.29.111
107.155.2.222
)
function fun
{
scp ./df.sh root@$1:/tmp/
ssh root@$1 "cd /tmp;chmod 777 df.sh;/bin/bash df.sh"
}
for ip in ${iplist[@]}
do
fun $ip
echo _____
done
EOF
chmod 777 sshall.sh
四、执行
./sshall.sh
结果:
tmpfs 6540056 0 6540056 0% /run/user/1001
_____
tmpfs 6540872 0 6540872 0% /run/user/1000
_____
tmpfs 6587832 0 6587832 0% /run/user/0
_____
tmpfs 388176 0 388176 0% /run/user/0
_____
五、总结
本文没有什么技术含量,只在分享一种方法,原理就是建立信任关系后利用scp远程拷贝文件和ssh远程执行命令。在实际操作中会用更灵活的应用方式。
当然,如果服务器数量不多,也可以使用terminator终端的分屏功能来实现操作,效果如下