需求背景是:linux
一个业务,有3台服务器(A,B,C)作负载均衡,因为规模过小目前并未使用专业的自动化运维工具。有新的需求时,开发同事改完代码会把变动上传到其中一台服务器A上。可是其余2台服务器也须要作相同变动。shell
写一个shell脚本,把A服务器上的变动代码同步到B和C上。bash
其中,你须要考虑到不须要同步的目录(假若有tmp、upload、logs、caches)服务器
#!/bin/bash echo "该脚本将会把A机器上的/data/wwwroot/www.aaa.com目录同步到B、C机器上" read -p "是否要继续(y|n)" rs() { rsync -azP \ #“\”,表示使行得以继续,命令能够继续正常输入 --exclude logs \ --exclude upload \ --exclude caches \ --exclude tmp \ www.aaa.com/ $1:/data/wwwroot/www.aaa.com } if [ $REPLY == 'y' -o $REPLY == 'Y' ] then echo "即将同步... ..." sleep 2 cd /data/wwwroot/ rs root@192.168.232.4 #B机器ip,格式:用户名@ip rs root@192.168.232.5 #C机器ip,格式:用户名@ip echo "同步完成。" elif [ $REPLY == 'n' -o $REPLY == 'N' ] then exit 1 else echo "请输入字母y或者n" fi
解析:负载均衡
rs() { }是函数,由{}包围的命令构成了一个代码块,也就是函数体。经过使用花括号{}包围命令,可使各类用途的命令关联在一块儿,构成一个总体。调用函数时,里面的命令会做为一个总体一块儿执行。运维
调用函数直接使用函数名像普通命令同样使用,直接这里直接使用rs,表示除了logs、upload、caches、tmp目录,将www.aaa.com下的文件同步到$1主机下的/data/wwwroot/www.aaa.com
ide
rsync命令是一个远程数据同步工具,格式为:rsync [OPTION]... SRC [USER@]host:DEST。 -a选项表示以递归方式传输文件,并保持全部文件的属性。-z选项表示对备份的文件在传输时进行压缩处理,-P选项 等同于 --partial选项,表示保留那些因故没有彻底传输的文件,以加快随后的再次传输。--exclude选项表示指定排除不须要传输的文件,能够是万用字符模式(如*.txt)函数
而须要特别说明的是,rsync -azP www.aaa.com/ root@192.168.232.2:/data/wwwroot 本地目录(www.aaa.com)的后面若是不加"/",则会把www.aaa.com这个目录以及目录下的文件一同同步,若是不加“/”,则只会同步目录下的文件,不会同步目录自己。
工具
函数体里面有集合命令后面用了反斜杠“\”,表示使行得以继续,命令能够继续正常输入,也就是函数体中的每行命令使用“\”,将其链接为一条命令。spa
这里有个变量$REPLY,为环境变量。在read命令行中,若是不指定变量,那么read命令会将接收到的数据放置在环境变量REPLY中。环境变量REPLY中包含最后一次输入的全部数据,能够像使用其余变量同样在shell脚本中使用环境变量REPLY.
if判断的含义是:若是read输入的变量值为"y"或者"Y",则依次输出“正在同步”,延迟2秒,进入/data/wwwroot/,执行函数体,输出“同步完成”,若是read 输入的变量值为"n"或"N",则退出,不然(以上两种状况都不存在),则输出请输入字母y或者n
sleep 2 表示延迟2秒