概述

ansible是通过ssh连接被管理的主机的。因此,在学习ansible之前,应该对ssh协议有一定的了解。


ssh协议支持的登陆认证方式

ssh支持两种登陆认证方式:


linux的openssh软件包

sshd、ssh、scp、sftp等命令都是openssh软件包提供的。其中:


配置公钥认证方式

如果想要支持基于用户名、口令的认证方式,那么需要在服务端的配置文件中设置如下选项:

PasswordAuthentication yes

如果想要支持基于公钥的认证方式,那么需要在服务端的配置文件中设置如下选项:

PubkeyAuthentication yes

注意:修改完配置文件之后,需要重启sshd。

下面以 在主机mongodb-101上,以用户vagrant的身份,无密码登陆主机mongodb-102 为例,讲述如何配置无密码ssh:

1,在mongodb-101上,使用ssh-keygen命令生成RSA秘钥对:

[vagrant@mongodb-101 ~]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/vagrant/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/vagrant/.ssh/id_rsa.
Your public key has been saved in /home/vagrant/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:gLz2t4bWPxywfluTVTY54feCPzCCPapV9FkijMpy2wM vagrant@mongodb-101
The key's randomart image is:
+---[RSA 2048]----+
|               . |
|   . .   o    . o|
|    o . . + . .=+|
|     o o.+ o = o=|
|    + E So= * o .|
|   . + +.o.o * . |
|      o+*. .+ o  |
|      o++o+. . . |
|     ....ooo     |
+----[SHA256]-----+

默认,公钥被保存在:~vagrant/.ssh/id_rsa.pub中,私钥被保存在:~vagrant/.ssh/id_rsa中。

2,将公钥追加到mongodb-102上的vagrant用户的AuthorizedKeysFile(默认在:~vagrant/.ssh/authorized_keys)中。需要注意:AuthorizedKeysFile的权限应该被设置成只有用户自己能访问。

3,接下来,就可以在mongodb-101上,以用户vagrant的身份,无密码登陆mongodb-102了:

[vagrant@mongodb-101 ~]$ ssh vagrant@mongodb-102

ssh登陆的详细过程

1,版本号协商阶段

ssh协议目前有ssh1和ssh2两个版本,因此,客户端和服务端需要通过版本号协商,确定最终使用的协议版本。具体过程如下:

2,密钥和算法协商阶段

ssh协议会用到非对称加密算法、对称加密算法、消息验证码(MAC,Message Authentication Code)算法、压缩算法等算法。因此,服务端和客户端都会向对方发送自己支持的算法列表,最后,协商出最终使用的算法。

接下来,服务端和客户端会使用DH密钥交换算法、主机密钥对等参数,生成会话id和会话密钥。具体过程如下:

3,认证阶段

a)基于账号和口令的认证方式

b)基于公钥的认证方式


几个常用的ssh特性

1,ControlMaster、ControlPersist

ControlMaster特性用于复用已经建立的连接。开启这个功能后,如果已经有一条到远程主机的连接,那么再次连接的时候,会复用之前建立的连接,而不是再创建一个。

ControlPersist特性用于将连接持久化。开启这个功能后,即使到远程主机最后一个连接被关闭了,也不会真正的关掉连接。以后再连接的时候,仍然会使用这个连接。

前面曾经提到过,ssh客户端的用户配置文件在$HOME/.ssh/config(需要注意:该文件的权限应该被设置成只有用户自己才能访问)。如果想要开启ControlMaster和ControlPersist特性,只需要在用户配置文件中,添加如下配置:

Host *
    ControlMaster auto
    ControlPath ~/.ssh/control-master-%r@%h:%p
    ControlPersist yes

2,ProxyCommand

ProxyCommand选项用于指定一个命令。ssh客户端通过标准输入和标准输出与命令启动后的进程进行通信

假设有三台服务器mongodb-101、mongodb-102、mongodb-103。其中,mongodb-101可以直接连接mongodb-102;mongodb-102可以直接连接mongodb-103;但是mongodb-101不能连接mongodb-103。在这个例子中,mongodb-101相当于ssh客户端,mongodb-102相当于跳板机,mongodb-103相当于隐藏在跳板机后面的服务器。那么如何配置才能使mongodb-101可以通过ssh连接mongodb-103呢?答案是:通过ssh的ProxyCommand选项。

Host mongodb-103
    ProxyCommand ssh mongodb-102 nc %h %p

注意:需要在mongodb-102上安装命令nc。