我们在搭建或维护集群的时候,很多情况下都需要将一个编写好的配置同步到集群中的其他机器。一个一个上传固然可以解决这个问题,但是当集群数量过大时就显得力不从心了,一个好用的集群间文件同步脚本就可以大大增加工作效率,在编写同步脚本之前需要先了解一些linux机器与机器之间文件的复制和同步的相关命令。
本文中用三台机器举例 机器名为 host2、host3、host4,每台机器都配置了hostname和ip的映射,在使用过程中直接使用hostname代替ip地址。hostname和ip的映射配置参见hostname与ip映射
主机与主机之间的文件拷贝
scp -r $pdir/$fname $user@$host:$pdir/$fname
参数 | 说明 |
---|---|
scp | 命令 |
-r | 递归 |
$pdir | 被拷贝的文件路径 |
$fname | 被拷贝的文件名 |
$user | 将要拷贝到的目标用户 |
$host | 主机 |
$pdir | 将要拷贝到的目标路径 |
$fname | 将要拷贝到的目标名称 |
将 host2 中/opt/module/jdk1.8.0_212 目录及目录中的文件拷贝到host3的中地址与host2相同。
使用命令拷贝前,要在host3上创建好目标目录(/opt/module/jdk1.80_212)
在host102中是有jdk1.8.0_212这个目录及文件的
在host2机器上执行安全拷贝命令
scp -r /opt/module/jdk1.8.0_212 congqing@host3:/opt/module
使用通配符拷贝 module下所有的目录到host3
scp -r /opt/module/* congqing@host3:/opt/module
输入host3的密码 按 Enter (注意输入密码时 交互界面是不会显示的)
用途:rsync 主要用于备份,
特点:速度快、避免复制相同内容和支持符号链接的优点。
rsync 和 scp 对比: rsync 文件的复制要比 scp 的速度快,rsync 只对差异文件做更新,而scp 是辅助所有文件
语法
rsync -av $pdir/$fname $user@$host:$pdir/$fname
参数 | 说明 |
---|---|
rsync | 命令 |
-a | 归档模式 |
-v | 显示复制过程 |
$pdir | 被拷贝的文件路径 |
$fname | 被拷贝的文件名 |
$user | 将要拷贝到的目标用户 |
$host | 主机 |
$pdir | 将要拷贝到的目标路径 |
$fname | 将要拷贝到的目标名称 |
eg
删除 host3中 /opt/module/jdk1.8.0_212
rm -rf jdk1.8.0_212/
将host2中的module目录重新同步到host3
rsync -av /opt/module/* congqing@host3:/opt/module
按提示 输入host3的密码
可以看见host3中删除的文件已经从host2重新同步过来了
循环复制文件到集群中所有节点的相同目录下
因为rsync的效率高于scp该脚本使用rsync命令实现
rsync脚本
#将host2中 /opt/module目录下的文件同步到 hots3的下,目录规格与host2对应
rsync -av /opt/module congqing@host3:/opt/
为实现脚本全局可用,先查看已经配置的PATH地址
echo $PATH
将脚本放置在用户的bin目录下就可以实现该用户在任意目录使用脚本命令
cd /home/congqing
# 默认情况下没有bin目录 需要进行创建
mkdir bin
cd bin
vim xsync
#!/bin/bash
#1. 参数校验,参数小于1 即不传递参数时,提示
if [ $# -lt 1 ]
then
echo Not Enough Arguement!
exit;
fi
#2. 遍历集群中的所有机器,这里做了hostname和ip的映射直接使用 hostname遍历集群,hostname和ip映射见http://cong.zone/archives/centos7%E4%BF%AE%E6%94%B9%E4%B8%BB%E6%9C%BA%E5%90%8D%E7%A7%B0
for host in host2 host3 host4
do
echo ==================== $host ====================
#3. 遍历所有目录,挨个发送
for file in $@
do
#4. 判断文件是否存在
if [ -e $file ]
then
#5. 获取父目录
pdir=$(cd -P $(dirname $file); pwd)
#6. 获取当前文件的名称
fname=$(basename $file)
ssh $host "mkdir -p $pdir"
rsync -av $pdir/$fname $host:$pdir
else
echo $file does not exists!
fi
done
done
在host2的/home/congqing 目录下创建一个cq目录,在cq目录中创建一个1.txt文件
xsync 1.txt
脚本授权
chmod 777 文件
看一下host3 和 host4中是否有对应文件
可以看到文件已经同步成功了
sudo /home/congqing/bin/xsync
注意:如果使用sudo,那么 xsync 一定要路径补全使用。
虽然以上已经实现了同步功能,但是要多次输入密码还是很麻烦,有没有不需要输入密码的方式呢?有的可以使用ssh无密登陆,下面开始解决这个问题
ssh host3
,如果想退出host3
exit
cd /home/congqing/.ssh
ll -a
ssh-keygen -t rsa
# 按三次Enter
ll
将公钥拷贝到要免密登录的目标机器上(包括本机)
ssh-copy-id host2
ssh-copy-id host3
ssh-copy-id host4
在host3和host4上重复执行,实现任意一台机器都可以免登陆到其他机器。
当前是在 congqing 用户先配置的无密码登陆,如果使用root或其他用户需要重新配置一次
再试一下xsync同步吧,看看是否还需要输入密码
本文参考了atguigu的同步脚本重新编辑,感谢atguigu的资料开源