侧边栏壁纸
博主头像
丛庆

没事儿写代码,有事写代码。email:1024@cong.zone

  • 累计撰写 116 篇文章
  • 累计创建 97 个标签
  • 累计收到 4 条评论

【CentOS7】centos7集群分发脚本xsync及ssh无密登陆 sync scp

丛庆
2022-01-10 / 0 评论 / 0 点赞 / 573 阅读 / 2,705 字 / 正在检测是否收录...
温馨提示:
部分资料和图片来源于网络,如有危害到您的利益请与我联系删除,1024@cong.zone。

我们在搭建或维护集群的时候,很多情况下都需要将一个编写好的配置同步到集群中的其他机器。一个一个上传固然可以解决这个问题,但是当集群数量过大时就显得力不从心了,一个好用的集群间文件同步脚本就可以大大增加工作效率,在编写同步脚本之前需要先了解一些linux机器与机器之间文件的复制和同步的相关命令。

本文中用三台机器举例 机器名为 host2、host3、host4,每台机器都配置了hostname和ip的映射,在使用过程中直接使用hostname代替ip地址。hostname和ip的映射配置参见hostname与ip映射

相关同步命令

安全拷贝命令 scp(secure copy)

用途

主机与主机之间的文件拷贝

语法

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这个目录及文件的
image-1649954997962

在host3中目录已经存在,但是没有文件
image-1649955065928

在host2机器上执行安全拷贝命令

scp -r /opt/module/jdk1.8.0_212 congqing@host3:/opt/module

使用通配符拷贝 module下所有的目录到host3

scp -r /opt/module/* congqing@host3:/opt/module

输入 yes 按 Enter
image-1649955163277

输入host3的密码 按 Enter (注意输入密码时 交互界面是不会显示的)
image-1649955199347

拷贝结束
image-1649955265528

查看host3目录中的文件
image-1649955300777
拷贝成功

远程同步工具rsync

用途: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/

image-1649956087817

将host2中的module目录重新同步到host3

rsync -av /opt/module/* congqing@host3:/opt/module

按提示 输入host3的密码

可以看见host3中删除的文件已经从host2重新同步过来了
image-1649956275207

xsync 集群分发脚本

用途

循环复制文件到集群中所有节点的相同目录下

原理介绍

因为rsync的效率高于scp该脚本使用rsync命令实现

rsync脚本

#将host2中 /opt/module目录下的文件同步到 hots3的下,目录规格与host2对应
rsync -av /opt/module congqing@host3:/opt/

脚本存放地址

为实现脚本全局可用,先查看已经配置的PATH地址

echo $PATH

image-1649987797244
将脚本放置在用户的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文件

image-1649989652296
执行脚本

xsync 1.txt

提示权限不够
image-1649989701409

脚本授权

chmod 777 文件

image-1649989810379

再次执行,需要多次输入密码
image-1649989865894

看一下host3 和 host4中是否有对应文件
可以看到文件已经同步成功了
image-1649989943518

image-1649989956151

root用户使用脚本

sudo /home/congqing/bin/xsync

注意:如果使用sudo,那么 xsync 一定要路径补全使用。

ssh无密登陆

虽然以上已经实现了同步功能,但是要多次输入密码还是很麻烦,有没有不需要输入密码的方式呢?有的可以使用ssh无密登陆,下面开始解决这个问题

ssh命令

ssh host3

执行后 就从host2奇幻到host3了
image-1649990707372

,如果想退出host3

exit

image-1649990769244

如果出现如下情况,输入 yes 按 Enter就好
image-1649990847659

配置RSA无密登陆

cd /home/congqing/.ssh
ll -a
ssh-keygen -t rsa
# 按三次Enter
ll

image-1649991152964

将公钥拷贝到要免密登录的目标机器上(包括本机)

ssh-copy-id host2
ssh-copy-id host3
ssh-copy-id host4

按照提示 输入密码
image-1649991342617

在host3和host4上重复执行,实现任意一台机器都可以免登陆到其他机器。
当前是在 congqing 用户先配置的无密码登陆,如果使用root或其他用户需要重新配置一次

再试一下xsync同步吧,看看是否还需要输入密码

image-1649992290058
可以看到不需要输入密码就可以同步啦,大功告成。

本文参考了atguigu的同步脚本重新编辑,感谢atguigu的资料开源

0

评论区