前言
当我们搭建集群的时候,通常需要重复性的安装多台虚拟机的很多相同的服务;这是可以采用建立在免密基础上的远程指令来完成,当然,一台一台的用远程指令来完成也显得很繁琐;别忘了,我们可以用shell脚本来实现,话不多少,下面看思路和代码!
一、shell脚本下的远程拷贝
首先我们得明确虚拟机的免密是实现此功能的前提必要条件;先让我们完成各虚拟机间的免密工作!
1.1 免密设置
- 生成秘钥
[root@single ~]# ssh-keygen -t rsa
- 本机免密设置(此步不设置也不影响)
[root@single .ssh]# cat id_rsa.pub >> authorized_keys
- 将本机公钥拷贝至需要远程访问的虚拟机上
- TIPS:确保目标虚拟机秘钥已生成,建好authorized_keys目录方便拷贝
[root@single .ssh]# ssh-copy-id -i id_rsa.pub root@slave01
- 测试连接:远程访问需要访问的虚拟机
[root@single .ssh]# ssh slave01
1.2 shell脚本配置
Attention:
- 设置访问名单如使用主机名请确保主机名和ip映射完成;
- 文件和目录拷贝分开,目录需递归拷贝;
创建并编辑脚本:
[root@single ~]# cd all
[root@single all]# vim all_send.sh
#!/bin/bash
if [ $# -lt 2 ];then
echo"palease input 2 args : source and dest path"
exit 0
fi
#远程访问名单-主机名(也可以换成ip)
#使用主机名请确保主机名和ip映射完成(没有请先去/etc/hosts下添加)
SERS="single master slave01 slave02 slave03"
echo "start to scp distribute : $1 ..."
for i in $SERS ;do
#防止本机重复拷贝
if [ $i != $HOSTNAME ];then
echo -n "----- $i -----"
#使用scp进行远程拷贝
#文件和目录分开考虑,目录需要加 -r实现递归拷贝
if [ -f $1 ];then
CMD=`scp $1 root@$i:$2`
elif [ -d $1 ];then
CMD=`scp -r $1 root@$i:$2`
fi
echo ok
fi
done
1.3 执行脚本并验证
当我们在某台虚拟机上安装了我们需要的服务,并完成了如上配置后,此时我们可以开始执行脚本进行远程拷贝了。
[root@single all]# ./all_send.sh /opt/software/ /opt
执行如下(slave03未做免密),其余做了免密均成功:
查看各个虚拟机:
二、shell脚本下的统一集群命令
当我们在工作环境中经常需要在多台虚拟机上执行某条命令时,例如查看每台服务器的服务运行情况;通常我们可能需要切换多个窗口依次查看,利用上面远程拷贝的思路,我们完全也可以用远程指令来完成指令的发布和结果的查看。
TIPS:需要先完成服务器之间的免密配置(具体见第一项的免密设置)
2.1 shell脚本配置
思路和上面配置类似:
#!/bin/bash
if [ $# -ne 1 ]
then
echo "please input one sys cmd(like 'jps' etc)"
fi
#设置访问名单
SERS="single master slave01 slave02 slave03"
for i in $SERS
do
echo "-------------------------- [ $1 ] $i --------------------------------"
#远程执行命令
CMD=`ssh root@$i "$1"`
#显示执行命令的结果
echo $CMD
done
2.2 执行脚本并验证
执行如下(slave03未做免密),其余做了免密均成功:
[root@single all]# ./alljps.sh jps
PS:如果有写错或者写的不好的地方,欢迎各位大佬在评论区留下宝贵的意见或者建议,敬上!如果这篇博客对您有帮助,希望您可以顺手帮我点个赞!不胜感谢!
原创作者:wsjslient |