共计 2275 个字符,预计需要花费 6 分钟才能阅读完成。
最近的一个项目要结合使用 rabbitmq、keepalived、supervisor。其中的一个场景为某个 keepalived 实例被提升为 MASTER 后需要到部署了 rabbitmq client 的远程主机上 kill 掉这些 client 进程。
一般的思路为配置 keepalived 所在主机与部署了 client 的主机之间的无密码 ssh 登录,然后通过 ssh 执行远程命令,先获取各 client 进程的进程号,然后逐个 kill 掉这些进程。
大体思路很简单,但过程中却碰到了不少问题。配置无密码 ssh 至远程主机的步骤比较简单。在此不多说。配置好后可以直接在脚本中使用:
ssh -p PORT IP “command”
或者
ssh -p PORT IP ‘command’
来在远程主机执行命令了。
先说说总设计问题。
刚开始是直线式的思维:先通过 ssh 远程获取 client 进程号,对于每个进程号分别 ssh 至远程执行 kill 操作。因为有多台 keepalived 实例分别运行于不同主机,这就需要在每个主机上维护一份需要处理的 client 列表,且需要多次通过 ssh 到远程部署 client 的主机执行获取进程号、杀进程的命名。这对于维护和性能来讲都是比较恶心的。
换一种思维方式,既然查进程后和 kill 进程号的操作都是在远程主机中完成的。为何不只在该远程主机维护一份需处理的 client 列表且把获取进程号和杀进程的这些操作封装成一个脚本放在该远程主机?这样其余的各 keepalived 实例所在主机只需在 ssh 命名中调用一次远程主机的脚本便可。省去了很多不必要的步骤。
上边是应用设计上的问题,可见在进行一个项目之前考虑清楚最优方案可为后续的实施减少多少的麻烦。遇到一个问题一定要从多个方面考虑。且尽量使用最简单的方式而不是最高大上的最复杂的的方式。
再来说所碰到的一些细节问题。
ssh -p PORT IP “command”
或者
ssh -p PORT IP ‘command’
的 command 中若包含变量的话,变量要用对应的引号引起来才能得以正确解析(实际上是 shell 中的字符串拼接)。
如:
consumer=worker_for_summary.py
则
ssh -p PORT IP “ps -ef | grep “$consumer” |grep -v grep”
或
ssh -p PORT IP ‘ps -ef | grep ‘$consumer’ |grep -v grep’
使用如下命令时不行的
ssh -p PORT IP ‘ps -ef | grep $consumer |grep -v grep’
另外在 ssh 中使用 awk 也需要注意,因为 awk 命令中使用单引号表明要执行的动作,所以相应的 ssh 中包围 command 的引号要改成双引号且 awk 中的“$”值为参数要加转移符
如:
consumer=worker_for_summary.py
则
ssh -p PORT IP “ps -ef | grep “$consumer” |grep -v grep | awk ‘{print \$2}'”
使用其他任何方式是不行的。
最后说说在 shell 脚本中使用 ssh 的注意
一般情况下执行 ssh -p PORT IP “command” 默认是使用当前用户到远程主机执行命令的。
若将 ssh -p PORT IP “command” 封装进了脚本,则会使用执行脚本时使用的用户登录至远程主机执行命令。
我们的应用中将 ssh -p PORT IP “command” 封装进了脚本,该脚本会在 keepalived 实例进入 MASTER 状态后由 keepalived 调用,而 keepalived 是由 root 用户启动的所以实际上会以 root 用户至远程主机执行命令。而我们配置的无密码 ssh 至远程主机用的是非 root 用户的工作(一般情况下是当前用户的公钥),因此远程命令不能成功执行,提示需要密码,即使是在 ssh -p PORT IP “command” 中加入用户信息变为 ssh -p PORT norootuser@IP “command” 也不行。因此通过生成 root 用户的公钥并配置无密码 ssh 到远程主机来规避了该问题。
在试密码的时候,记错了密码导致账户被锁定不能登录,可以通过 faillog 命令查看失败记录并设置登录失败限制。
如:
查看用户登录失败情况
sudo faillog -u op1
重置用户
sudo faillog -u op1 -r
提高 Ubuntu 的 SSH 登陆认证速度的办法 http://www.linuxidc.com/Linux/2014-09/106810.htm
开启 SSH 服务让 Android 手机远程访问 Ubuntu 14.04 http://www.linuxidc.com/Linux/2014-09/106809.htm
如何为 Linux 系统中的 SSH 添加双重认证 http://www.linuxidc.com/Linux/2014-08/105998.htm
在 Linux 中为非 SSH 用户配置 SFTP 环境 http://www.linuxidc.com/Linux/2014-08/105865.htm
Linux 上 SSH 服务的配置和管理 http://www.linuxidc.com/Linux/2014-06/103627.htm
SSH 入门学习基础教程 http://www.linuxidc.com/Linux/2014-06/103008.htm
SSH 免密码登录详解 http://www.linuxidc.com/Linux/2015-03/114709.htm
本文永久更新链接地址:http://www.linuxidc.com/Linux/2015-04/116700.htm