需求背景是:
一个业务, 有 3 台服务器 (A,B,C) 做负载均衡, 由于规模太小目前并未使用专业的自动化运维工具有新的需求时, 开发同事改完代码会把变更上传到其中一台服务器 A 上但是其他 2 台服务器也需要做相同变更
写一个 shell 脚本, 把 A 服务器上的变更代码同步到 B 和 C 上
其中, 你需要考虑到不需要同步的目录(假如有 tmpuploadlogscaches)
- #!/bin/bash
- echo "该脚本将会把 A 机器上的 / data/wwwroot/www.aaa.com 目录同步到 BC 机器上"
- 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, 表示除了 logsuploadcachestmp 目录, 将 www.aaa.com 下的文件同步到 $1 主机下的 / data/wwwroot/www.aaa.com
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 这个目录以及目录下的文件一同同步, 如果不加 /, 则只会同步目录下的文件, 不会同步目录本身
函数体里面有集合命令后面用了反斜杠 \, 表示使行得以继续, 命令可以继续正常输入, 也就是函数体中的每行命令使用 \, 将其连接为一条命令
这里有个变量 $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) 做负载均衡, 由于规模太小目前并未使用专业的自动化运维工具
来源: http://www.bubuko.com/infodetail-2495588.html