2012-10-30 created
2012-11-1 last updated
当超过3台机器搞到一起, 管理起来就会陷入混乱不堪. 因此需要证书登录的方式来管理服务器集群. master节点可以直接ssh登录到数据节点. 控制节点可以直接登录到被控制的节点.借用C/S的概念, 客户机需要安装openssh-client, 服务器需要安装openssh-server.其实我们很快会分布清楚哪些是服务,哪些是客户. 因此所有机器上都安装openssh,你可以按下面的命令检查是否安装了它们:
(car@A:~$ 意思是用户名为car, 机器名为A, 当前目录为/home/car)
car@A:~$ apt-cache policy openssh-client
car@A:~$ apt-cache policy openssh-server
你也可以直接安装它们:
car@A:~$ sudo apt-get install openssh-client
car@A:~$ sudo apt-get install openssh-server
另外需要安装一个ssh无交互式密码登陆的软件sshpass, 这样我们就可以把密码写到命令行里. 从而使无人工干预的脚本安装过程成为可能.
car@A:~$ sudo apt-get install sshpass
安装完毕之后, 你可以在A访问任何另外一台B.
car@A:~$ sshpass -p abc123 ssh car@B
其中:
car是B的用户名, 我们这里假设A, B用户名都是car.
abc123是B上的car的密码.
借用这个技术, 你可以轻松登录每台机器而不需要交互式地输入密码. 但这绝对是不安全的, 这个仅仅是安装阶段的脚本.有了上面的准备后, 下面开始实践ssh证书登录方式:
假设我们想要在A访问另外一台B, 于是我们需要在A上生成公钥密钥对(ssh-keygen).然后把A的公钥拷贝到B上, 在B上把A的公钥(id_rsa.pub.A)加入到B的某个用户(car)的主目录下的authorized_keys文件里, 然后在A上就可以直接登录B了(以car用户登录B).
/home/car/.ssh/authorized_keys
car@A:~$ ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
或:
car@A:~$ ssh-keygen
可以看到下面2个文件生成了.
/home/car/.ssh/id_rsa
/home/car/.ssh/id_rsa.pub
car@A:~$ scp ./.ssh/id_rsa.pub car@B:~/id_rsa.pub.A
其中B是IP地址, 也可以是机器名, 但是需要在A的/etc/hosts增加一项, 如:
...
192.168.63.101 B
...
car@A:~$ sshpass -p abc123 ssh car@B
car@B:~$ cat ./id_rsa.pub.A ./.ssh/authorized_keys
car@B:~$ exit
2,3,4步可以整合为一步:
# ssh-copy-id car@B
car@A:~$ ssh car@B
比如我们还需要在C上登录B:
# 拷贝A的私钥到C
car@A:~$ sshpass -p abc123 scp ./.ssh/id_rsa car@C:~/id_rsa.A
# 登录到C
car@A:~$ sshpass -p abc1234 ssh car@C
# 删除C的证书并重建证书 (任何时候删除一个机器上的.ssh证书都不是可怕的事情, 但是一旦证书体系弄好之后, 删除了某个机器上的证书会导致整个系统无法正常工作. 因此维护一套严格测试的脚本,以能在任何时候恢复整个云计算环境的证书体系是至关重要的)
car@C:~$ sudo rm -r ./.ssh/
# 重建C的证书
car@C:~$ ssh-keygen
一路回车
# 把A的私钥放置到C的.ssh目录下
car@C:~$ sudo mv ./id_rsa.A ./.ssh/
# 现在可以从C上远程ssh登录B了, 当然需要指定证书名称: id_rsa.A
car@C:~$ ssh -i ./.ssh/id_rsa.A car@B
# 此时回出现恼人的提示, 以确认你是否把B的IP加入到 .ssh/known_hosts,为去除这个(yes/no)的提示, 你既可以在C的/etc/ssh/ssh_config里面更改配置为:
...
StrictHotKeyChecking no
...
# 也可以:
car@C:~$ ssh -o StrictHotKeyChecking=no -i ./.ssh/id_rsa.A car@B
这样就不会有提示了(-o StrictHotKeyChecking=no 选项起了作用).
比如在A上, 我们想登录到B的时候是root用户.
# 切换到root@B, 给root设置密码:
2次输入相同的密码
# 看看/root下面的.ssh里有啥, 没有就ssh-keygen创建一个:
# 把A上的公钥id_rsa.pub拷贝到B, 然后登录到B,把id_rsa.pub.A加入到/root/.ssh/authorized_keys里
car@A:~$ sshpass -p abc123 scp ./.ssh/id_rsa.pub car@B:~/id_rsa.pub.A
car@A:~$ sshpass -p abc123 car@B
car@B:~$ sudo cat ./id_rsa.pub.A >> /root/.ssh/authorized_keys
# 然后回到A, 此时就可以远程直接登录到B(以root用户)
car@A:~$ ssh root@B
a. 私钥文件id_rsa.A是不能随意发布的, 一般需要设置密码. 不在本文讲述范围.
b. 本文虽然混合大小写, 你应该任何时候只用小写字母.
c. 本文中凡是出现机器名的地方, 在实践中一律应改为机器的IP地址.
d. 当ssh car@B时出现错误:
Agent admitted failure to sign using the key
在A上运行命令:
# ssh-add