批量同步代码:有3台服务器(A,B,C)做负载均衡,由于规模太小目前并未使用专业的自动化运维工具
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了批量同步代码:有3台服务器(A,B,C)做负载均衡,由于规模太小目前并未使用专业的自动化运维工具相关的知识,希望对你有一定的参考价值。
需求背景是:
一个业务,有3台服务器(A,B,C)做负载均衡,由于规模太小目前并未使用专业的自动化运维工具。有新的需求时,开发同事改完代码会把变更上传到其中一台服务器A上。但是其他2台服务器也需要做相同变更。
写一个shell脚本,把A服务器上的变更代码同步到B和C上。
其中,你需要考虑到不需要同步的目录(假如有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 [email protected] #B机器ip,格式:用户名@ip rs [email protected] #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
rsync命令是一个远程数据同步工具,格式为:rsync [OPTION]... SRC [[email protected]]host:DEST。 -a选项表示以递归方式传输文件,并保持所有文件的属性。-z选项表示对备份的文件在传输时进行压缩处理,-P选项 等同于 --partial选项,表示保留那些因故没有完全传输的文件,以加快随后的再次传输。--exclude选项表示指定排除不需要传输的文件,可以是万用字符模式(如*.txt)
而需要特别说明的是,rsync -azP www.aaa.com/ [email protected]:/data/wwwroot 本地目录(www.aaa.com)的后面如果不加"/",则会把www.aaa.com这个目录以及目录下的文件一同同步,如果不加“/”,则只会同步目录下的文件,不会同步目录本身。
函数体里面有集合命令后面用了反斜杠“\”,表示使行得以继续,命令可以继续正常输入,也就是函数体中的每行命令使用“\”,将其连接为一条命令。
这里有个变量$REPLY,为环境变量。在read命令行中,如果不指定变量,那么read命令会将接收到的数据放置在环境变量REPLY中。环境变量REPLY中包含最后一次输入的所有数据,可以像使用其他变量一样在shell脚本中使用环境变量REPLY.
if判断的含义是:如果read输入的变量值为"y"或者"Y",则依次输出“正在同步”,延迟2秒,进入/data/wwwroot/,执行函数体,输出“同步完成”,如果read 输入的变量值为"n"或"N",则退出,否则(以上两种情况都不存在),则输出请输入字母y或者n
sleep 2 表示延迟2秒
以上是关于批量同步代码:有3台服务器(A,B,C)做负载均衡,由于规模太小目前并未使用专业的自动化运维工具的主要内容,如果未能解决你的问题,请参考以下文章