CentOS8虚拟机之间的通信

虚拟机之间的通信

  • ssh认证
  • 免密登录
  • 通过主机名实现ssh连接
  • 更加简单的同步 rsync 与其二次封装的 xsync

学习大数据,配置集群时,需要先让虚拟机之间能够自由通信。
看这篇文章前,必须确保各虚拟机的IP在同一网段。参考 Linux虚拟机安装及静态IP配置

下图是我自己安装了4台 centos8 虚拟机,并配置了静态IP:192,168.1.31192,168.1.32192,168.1.33192,168.1.34 。它们对应的主机名分别是flink01、flink02、flink03、flink04.

image.png

后边讲解下我是如何让这4台虚拟机免密连接的。不过文章截图都是我配置好后的截图,与配置过程可能有差异。

ssh认证

SSH 是较可靠,专为 远程登录 会话和其他网络服务提供安全性的协议。

1、修改配置文件 /etc/ssh/sshd_config

RSAAuthentication yes # 启用 RSA 认证
PubkeyAuthentication yes # 启用公钥私钥配对认证方式
AuthorizedKeysFile .ssh/authorized_keys # 公钥文件路径

2、测试 192,168.1.31192,168.1.32 是否能够通信:[root@flink01 ~]# ssh 192,168.1.32。没配置免密登录前,是需要输入密码。

3、分别在各台虚拟机上生成密钥对:例如 flink01虚拟机,[root@flink01 ~]# ssh-keygen -t rsa。此时 ~/ 下会生成一个 .ssh 文件夹(开始时没有,如果有可能是其他ssh自动生成的),该文件夹内有2个文件id_rsaid_rsa.pub,其中 id_rsa.pub 里边放着本机的公钥。

image.png

4、从上图中可以看到还有两个文件,其中 authorized_keys 是我自己创建的,写入所有虚拟机的公钥。则该电脑则可以免密登录所有虚拟机了。现在可以再次试一下[root@flink01 ~]# ssh 192,168.1.32

第一次应该不能识别 192,168.1.32 ,让输入密码。输入密码成功后系统背后会自动生成 ~/.ssh/known_hosts (有则不生成) ,并将 192,168.1.32 的认证数据写入到该文件。然后下次 [root@flink01 ~]# ssh 192,168.1.32 就不会能识别不用输入密码了。

image.png

我感觉将内容全部复制,粘贴到一个文件就挺方便的。不过这里还是介绍下 scpcat两个命令,可以更优雅的实现上边的配置。

scp 可传输文件或整个文件夹到另一台设备上。这里是传输的是一个文件,如果另一台设备上有该文件则被替换
[root@flink01 ~]# scp ~/.ssh/authorized_keys [email protected]:~/

cat 一般用于读取某个文件的内容。这里是将第一个文件内容追加到第二个文件内,如果第二个文件没有,则会创建然后追加(相当于复制)
[root@flink02 ~]# cat ~/authorized_keys >> ~/.ssh/authorized_keys
[root@flink02 ~]# cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
[root@flink02 ~]# cat ~/.ssh/authorized_keys

删除 192.168.1.32:~/authorized_keys
[root@flink02 ~]# rm -rf ~/authorized_keys

5、上边提到 ~/.ssh/known_hosts 是在 ssh 访问其他虚拟机时,免密认证前的识别,通过密码登录另一台电脑时,将会自动写入另一台电脑的相关信息。

[root@flink01 ~]# ssh 192,168.1.31
// 自己
[root@flink01 ~]# ssh 192,168.1.32
// 输入密码
[root@flink01 ~]# ssh 192,168.1.33
// 输入密码
[root@flink01 ~]# ssh 192,168.1.34

当然也可以手动更改配置的,我的如下:

image.png

各虚拟机的 ~/.ssh/known_hosts 也保持一致。可以粗暴的复制粘贴,也可以使用 scpcat 命令

6、上图中我还将各虚拟机的主机名追加在了对应位置:flink01,192.168.1.31 ecaddsa-sha2... 是希望虚拟机之间可以通过虚拟机的主机名就能访问。

7、配置 [root@flink01 ~]# vim /etc/hosts

image.png

8、可以试下:[root@flink01 ~]# ssh flink02 。可以发现现在不需要记住各虚拟机的IP,就能通信了。后边配置集群,设置host时,也可以直接使用主机名了。

9、如果是普通用户,步骤同上,不过要设置文件读取权限。

chmod 600 ~/.ssh/authorized_keys

是不是很开心的解决了 CentOS8虚拟机之间的通信 呢?欢迎大家评论。如果觉得好,就来个赞吧。

更加简单的同步 rsync 与其二次封装的 xsync

相对spc,用rsync做文件的复制的速度更快。rsync只对有差异文件做更新,而scp是把所有文件都复制过去。

安装:

[root@flink01 ~]# yum install -y rsync

二次封装rsync的 xsync

  • 查看全局环境变量的所有路径,在其中一个路径下创建脚本文件
[root@flink01 ~]# echo $PATH
/opt/jdk1.8.0_291/bin:/opt/hadoop-3.3.1/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

[root@flink01 ~]# vim /root/bin/xsync
  • 编辑 /root/bin/xsync,输入如下内容
#1. 判断参数个数
if [ $# -lt 1 ]
then
    echo Not Enough Arguement!
    exit;
fi

#2. 遍历集群所有机器
for host in flink01 flink02 flink03
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
  • 放开 /root/bin/xsync 权限:
[root@flink01 bin]# chmod +x xsync
  • 在任意路径下使用 xsync,看是否能将文件同步到其他主机。例如同步 /root/bin/xsync ,让其他主机也有同步功能:
[root@flink01 bin]# xsync ~/bin/xsync
==================== flink01 ====================
sending incremental file list

sent 44 bytes  received 12 bytes  112.00 bytes/sec
total size is 733  speedup is 13.09
==================== flink02 ====================
sending incremental file list
xsync

sent 824 bytes  received 35 bytes  572.67 bytes/sec
total size is 733  speedup is 0.85
==================== flink03 ====================
sending incremental file list
xsync

sent 824 bytes  received 35 bytes  1,718.00 bytes/sec
total size is 733  speedup is 0.85

  • 连接 flink02,发现 flink02 中已经有该文件了。同样放开该文件权限即可使用了 _
[root@flink02 bin]# chmod +x xsync

你可能感兴趣的:(CentOS8虚拟机之间的通信)