xsync同步文件脚本实现

目录

1、目的

多个环境具有相同配置(例如分布式环境搭建zookeeper集群、kafka集群、Hadoop集群等)

多个环境都需要相同版本的jdk或者其他服务,这里以jdk为例;其他服务类似!

1. 环境准备

  • 创建普通用户geray,并配置具有root权限,方便后期执行sudo命令
# 添加geray用户
useradd geray

# 配置密码
passwd geray

# 配置root权限
# 修改/etc/sudoers 文件,在%wheel 这行下面添加一行,如下所示:
vim /etc/sudoers
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL

## Allows members of the 'sys' group to run networking, software,
## service management apps and more.
# %sys ALL = NETWORKING, SOFTWARE, SERVICES, STORAGE, DELEGATING, PROCESSES, LOCATE, DRIVERS

## Allows people in group wheel to run all commands
%wheel  ALL=(ALL)       ALL
geray   ALL=(ALL)       NOPASSWD:ALL

注意:geray这一行不要直接放到 root 行下面,因为所有用户都属于 wheel 组,你先 配置了 geray具有免密功能,但是程序执行到%wheel 行时,该功能又被覆盖回需要 密码。所以 geray要放到%wheel 这行下面。

2、环境架构

IP 主机名 测试软件
192.168.6.61 node1 JDK
192.168.6.62 node2 JDK
192.168.6.63 node3 JDK

3、集群分发脚本xsync

1. scp(secure copy)安全拷贝

scp命令可以实现服务器与服务器之间的数据拷贝(from server1 to server2)

# 基本语法

# 1. 拷贝文件到远程服务
scp    -r    	$pdir/$fname    		$user@$host:$pdir/$fname
#命令  递归	  要拷贝文件的路径/文件民		目标服务器用户@主机:目的地路径/文件名

# 2. 拷贝远程服务文件到本地
scp    -r    	$user@$host:$pdir/$fname			$pdir/$fname
#命令  递归	  目标服务器用户@主机:目的地路径/文件名		要拷贝文件的路径/文件民	

# 3. 拷贝远程服务文件到远程服务
scp    -r    	$user@$host:$pdir/$fname		$user@$host:$pdir/$fname
#命令  递归	  		要拷贝文件的路径/文件民		目标服务器用户@主机:目的地路径/文件名

2. scp命令案例

拷贝node1主机的/opt/module/jdk1.8.0_291/解压文件和/opt/software/jdk-8u291-linux-x64.tar.gz到node2和node3

前提条件:

  • 添加域名解析

  • 非root用户:geray
  • 在node2和node3服务器上创建目录/opt/module,并设置所属用户和所属组为geray
# 在node2和node3节点创建目录并分配用户和用户组
sudo mkdir /opt/{module,software}

sudo chown -R geray:geray /opt/{module,software}

# 添加域名解析
sudo vim /etc/hosts
# 追加以下内容
192.168.6.61 node1
192.168.6.62 node2
192.168.6.63 node3

1)拷贝文件到远程服务

在node1节点上,拷贝node1节点上的/opt/module/jdk1.8.0_291/到node2节点

scp -r /opt/module/jdk1.8.0_291/ geray@node2:/opt/module/

2)拷贝远程服务文件到本地

在node3节点上,拷贝node2节点上的/opt/module/jdk1.8.0_291/到node3节点

scp -r geray@node2:/opt/module/jdk1.8.0_291/ /opt/module/

3)拷贝远程服务文件到远程服务

在node2节点上,拷贝node1节点上的/opt/software/下的所有文件到node3节点

scp -r geray@node1:/opt/software/* geray@node3:/opt/software/

3. rsync远程同步工具

安装该命令:sudo yum -y install rsync(每个节点都需要安装)

rsync主要用于备份和镜像

  • 速度快
  • 避免复制相同内容
  • 支持符号链接

rsync和scp区别:

  • rsync用于复制文件的速度比scp命令快

  • rsync只对差异文件做更新
  • scp是把所有文件都复制过去
# 基本语法

rsync	 -av	$pdir/$fname    		$user@$host:$pdir/$fname
#命令		参数	要拷贝文件的路径/文件民	目标服务器用户@主机:目的地路径/文件名

参数选项:

选项 功能
-a 归档拷贝
-v 显示复制过程

4. rsync命令案例

1)删除node3中的/opt/software中的jdk文件

rm -rf /opt/software/jdk-8u291-linux-x64.tar.gz

2)同步node1中的/opt/software下的所有文件到node3

rsync -av /opt/software/* geray@node3:/opt/software/

5. xsync集群分发脚本

1)脚本实现

  1. 需求:循环复制文件到所有节点的相同目录下

  2. 需求分析:

    • 原始拷贝命令:
    rsync	 -av	$pdir/$fname    		$user@$host:$pdir/$fname
    #命令		参数	要拷贝文件的路径/文件民	目标服务器用户@主机:目的地路径/文件名
    
    • 期望脚本:
    xsync 要同步的文件名称
    
    • 期望脚本可以在任何路径下都可以使用(脚本放在全局变量PATH路径中)
  3. 脚本实现

    • 在当前用户下创建bin目录,并创建xsync文件
    mkdir ~/bin
    touch ~/bin/xsync
    chmod +x xsync
       
    # 设置环境变量
    sudo vim /etc/profile.d/my_env.sh
       
    
    • 文件内容如下:
    #!/bin/bash
       
    # 1. 判断参数个数
    if [ $# -lt 1 ]
    then
    	echo "没有指定参数!"
    	exit
    fi
       
    # 2. 遍历集群所有机器
    for host in node2 node3
    do
    	echo "======== $host ========$"
       	
    	# 3. 遍历所有目录,挨个发送
    	for file in $@
    	do
    		# 4. 判断文件是否存在
    		if [ -e $file ]
                then
                    # 5. 如果文件存在(-P 进入实际目录,例如软链接)
                    pdir=$(cd -P $(dirname $file); pwd)
       
                    # 6. 获取当前文件名称(即便给定的是路径,也只需要文件名称)
                    fname=$(basename $file)
                    # 这里的-p表示即便目标路径存在,不做任何操作和提示
                    ssh $host "mkdir -p $pdir"
                    rsync -av $pdir/$fname $host:$pdir
    			else
    				echo "$file 你传递的文件名不存在!"
    		fi
    	done
    done
    

2)分发xsync脚本文件和my_env.sh环境变量文件

xsync ./bin/xsync /etc/profile.d/my_env.sh

权限不足:/etc目录下的文件都是root用户的

rsync: mkstemp "/etc/profile.d/.my_env.sh.51wxGR" failed: Permission denied (13)

解决办法:

sudo ./bin/xsync ./bin/xsync /etc/profile.d/my_env.sh

3)分发jdk安装包

xsync /opt/software/*

4、SSH免密登录

1. 免密登录的原理

私钥和公钥文件名称(id_rsa、id_rsa.pub)

  1. A服务器生成密钥对(公钥A、私钥A)
  2. 拷贝A服务器的公钥A到B服务器的授权文件(autoorized_keys)中
  3. A服务器访问B服务器(数据使用私钥A加密)
  4. B服务器接收到数据后,去授权key中查找A的公钥,并解密数据
  5. 采用A公钥加密的数据返回给A
  6. A服务器接收到数据后,用私钥A解密数据

2. 生成公钥和私钥

ssh-keygen -t rsa

然后敲(三个回车),就会生成两个文件 id_rsa(私钥)、id_rsa.pub(公钥)

3. 将公钥拷贝到要免密登录的目标机器上

ssh-copy-id node1
ssh-copy-id node2
ssh-copy-id node3

注意: 还需要在其他两个节点node2、node3上使用geray用户,同样的方式进行配置免密登录

4. .ssh 文件夹下(~/.ssh)的文件功能解释

文件名 说明
known_hosts 记录 ssh 访问过计算机的公钥(public key)
id_rsa 生成的当前用户私钥
id_rsa.pub 生成的当前用户公钥
authorized_keys 存放授权过的无密登录服务器公钥