背景
在运维或在日常工作生活中,我们经常会把一个文件拷贝到其它服务器上,或同时分发到多个服务器上,甚至要求目标机将文件放在相同的路径下,方便程序进一步调用。
遇到这种问题,我们通常的做法是使用scp或rsync命令把文件拷贝一个一个地拷贝到多台服务器上,这样做费时费力;大神的做法是使用ansible的playbook一下把事情干完,前提是你得会ansible;快捷的做法就是使用今天的脚本了。
效果演示目前拥有4台机器,分别为client、node1、node2和node3,client与其它3台机器能够建立ssh链接。在client的/root/test目录下有a.txt和b.txt两个文件。
主机名称
[root
clienttest]#ls/root/test/a.txtb.txt[rootclienttest]#我把文件分发到node1、node2和node3的/root/test下,执行以下命令:
#在/root/test目录下执行,xrsync是我的脚本[root
clienttest]#xrsynca.txtb.txt执行分发过程:
[root
clienttest]#xrsynca.txtb.txt============node1============sendingincrementalfilelista.txtsent93bytesreceived35bytes.00bytes/sectotalsizeis2speedupis0.02sendingincrementalfilelistb.txtsent93bytesreceived35bytes85.33bytes/sectotalsizeis2speedupis0.02============node2============sendingincrementalfilelista.txtsent93bytesreceived35bytes.00bytes/sectotalsizeis2speedupis0.02sendingincrementalfilelistb.txtsent93bytesreceived35bytes.00bytes/sectotalsizeis2speedupis0.02============node3============sendingincrementalfilelista.txtsent93bytesreceived35bytes85.33bytes/sectotalsizeis2speedupis0.02sendingincrementalfilelistb.txtsent93bytesreceived35bytes.00bytes/sectotalsizeis2spee到node2上看一下,文件果然存在。同样地,node3和node4也同步过去了。
#node2上查看[root
node2~]#ls/root/test/a.txtb.txt[rootnode2~]##node3上查看[rootnode3~]#ls/root/test/a.txtb.txt[rootnode3~]##node4上查看[rootnode4~]#ls/root/test/a.txtb.txt[rootnode4~]#脚本奉上整个脚本的代码,只需要把其中的node1node2node3修改为自己环境下的主机名或ip地址即可。
#!/bin/bash#判断参数是否足够if[$#-lt1]thenechoNotEnounhArguement!exit;fi#遍历所有的机器forhostinnode1node2node3doecho============$host============forfilein$
do#判断文件是否存在if[-e$file]then#获取父目录pdir=$(cd-P$(dirname$file);pwd)#获取当前目录的名称fname=$(basename$file)ssh$host"mkdir-p$pdir"rsync-av$pdir/$fname$host:$pdirelseecho$filedoesnotexists!fidonedone运行条件为了更方便脚本的运行,建议使用如下优化。
1.修改/etc/hosts文件,加入IP地址与主机名的对应关系,这样方便我们使用主机名直接操作。比如我演示的机器配置。
vim/etc/hosts#加入配置,自己的机器对应修改……..31.47client..31.48node1..31.50node2..31.51node3
2.客户机与目标机之间使用ssh密码验证登录,这样在传输文件时不需要二次验证。
#生成ssh私钥ssh-keygen-f/root/.ssh/id_rsa-N#循环把公钥传递到服务器上,免密登录foriinnode1node2node3dossh-copy-id$idone#根据提示输入密码
3.给脚本加可执行权限,并配置环境变量,使用全局可用。
#把文件存储为xrsync,加上x权限[root
clientshell]#chmod+xxrsync[rootclientshell]##配置环境变量#我把脚本放在/opt/shell下的,自己情况类比修改[rootclientshell]#vim/etc/profile.d/my_env.shexportPATH=$PATH:/opt/shell#配置生效,就可以在全局生效了[rootclientopt]#source/etc/profile至此,早点干完活,开始愉快的玩耍吧~