背景在运维或者日常工作生活中,我们经常会把一个文件复制到其他服务器上,或者同时分发到多个服务器上服务器,甚至要求目标机把文件放在同一个路径下,这样才能进一步调用程序。遇到这种问题,我们通常的做法是使用scp或者rsync命令,将文件一个一个复制到多个服务器上。你需要知道ansible;快速的方法是使用今天的脚本。效果演示目前有4台机器,分别是client、node1、node2和node3,client可以和另外3台机器建立ssh链接。客户端/root/test目录下有a.txt和b.txt两个文件。[root@clienttest]#ls/root/test/a.txtb.txt[root@clienttest]#我把文件分发到node1、node2、node3的/root/test下,执行如下命令:#in/root/test在目录下执行,xrsync是我的脚本[root@clienttest]#xrsynca.txtb.txt执行分发过程:[root@clienttest]#xrsynca.txtb.txt==============node1============发送增量文件列表a.txtssent93bytesreceived35bytes256.00bytes/sectotalsizeis2speedupis0.02sendingincrementalfilelistb.txtssent93bytesreceived35bytes85.33bytes/sectotalsizeis2speedupis0.02==========node2========sendingincrementalfilelista.txtsent93bytesreceived35bytes256.00bytes/sectotalsizeis2speedupis0.02sendingincrementalfilelistb.txtsent93bytesreceived35bytes256.00bytes/sectotalsizeis2speedupis0.02============node3============sendingincrementalfilelista.txtsent93bytesreceived35bytes85.33bytes/sectotalsizeis2speedupis0.02sendingincrementalfilelistb.txtsent93bytesreceived35bytes256.00bytes/sectotalsizeis2spee去node2看t文件确实存在。同样,node3和node4也同步了。#在node2上查看[root@node2~]#ls/root/test/a.txtb.txt[root@node2~]##在node3上查看[root@node3~]#ls/root/test/a.txtb.txt[root@node3~]##Viewonnode4[root@node4~]#ls/root/test/a.txtb.txt[root@node4~]#脚本提供了整个脚本的代码,把把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#加入配置,相应修改自己的机器...192.168.31.47client192.168.31.48node1192.168.31.50node2192.168.31.51node32.客户端和目标机之间使用ssh密码验证登录,这样就可以传输文件了,不需要二次验证。#生成ssh私钥ssh-keygen-f/root/.ssh/id_rsa-N''#循环传递公钥给服务器,免密码登录foriinnode1node2node3dossh-copy-id$idone#根据提示输入密码3.给脚本添加可执行权限,并配置环境变量,全局可用。#将文件存储为xrsync,加上x权限[root@clientshell]#chmod+xxrsync[root@clientshell]##配置环境变量#我把脚本放在/opt/shell下,自己的情况类推修改【root@clientshell]#vim/etc/profile.d/my_env.shexportPATH=$PATH:/opt/shell#配置生效,可以全局生效[root@clientopt]#source/etc/profile
