ansible是通过ssh连接被管理的主机的。因此,在学习ansible之前,应该对ssh协议有一定的了解。
ssh支持两种登陆认证方式:
基于账号、口令的认证方式
基于公钥的认证方式
sshd、ssh、scp、sftp等命令都是openssh软件包提供的。其中:
sshd是服务端程序,用来启动ssh服务,其默认配置文件在/etc/ssh/sshd_config
ssh是命令行客户端,其默认配置文件在/etc/ssh/ssh_config,用户自己的配置文件在$HOME/.ssh/config
scp是基于ssh的远程文件拷贝命令。它即可将本地文件拷贝到远程主机,也可以将远程主机上的文件拷贝到本地。比如:
将本地文件拷贝到远程主机
将远程主机上的文件拷贝到本地
递归地将本地目录及其子目录中的所有文件拷贝到远程主机
递归地将远程主机上的目录及其子目录中的所有文件拷贝到本地
sftp是安全文件传输协议,它提供了与ftp类似的命令。比如:ls、get、put等。其与ftp的不同之处是:
如果想要支持基于用户名、口令的认证方式,那么需要在服务端的配置文件中设置如下选项:
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
1,版本号协商阶段
ssh协议目前有ssh1和ssh2两个版本,因此,客户端和服务端需要通过版本号协商,确定最终使用的协议版本。具体过程如下:
2,密钥和算法协商阶段
ssh协议会用到非对称加密算法、对称加密算法、消息验证码(MAC,Message Authentication Code)算法、压缩算法等算法。因此,服务端和客户端都会向对方发送自己支持的算法列表,最后,协商出最终使用的算法。
接下来,服务端和客户端会使用DH密钥交换算法、主机密钥对等参数,生成会话id和会话密钥。具体过程如下:
3,认证阶段
a)基于账号和口令的认证方式
b)基于公钥的认证方式
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。