如何在集群中的一个节点上执行命令操控该集群的另一个节点或一些节点,这里就涉及到ssh免密登录服务了

火山日常啰嗦
开始考虑这个问题,其实是因为每次开启集群的服务时都要到每个节点输入一大堆指令,这样做真的是很烦,而且总是些重复性的东西,没什么新意,也很耗时,更重要的是,集群很小,只有几个节点的话,做这种操作还好,但是一旦集群很大呢,有成千上万个节点时,这样子去操作根本就不现实,可能仅仅是开启服务就要花几天甚至几个月了吧,那还用做真正有意义的工作吗?基于这种情况,所以我们考虑编写脚本文件来开启集群服务,这样就不需要我们一个一个节点地去敲命令了,节省了不少功夫。

那编写脚本,只需要在一个节点上编写就行了,那问题来了,既然只在一个节点上编写,那么怎么在这个节点控制其他节点啊?
这里就要用到ssh免密登录服务了(这里是默认大家都了解并且配好了ssh免密登录),在脚本里通过ssh登录其他节点并且执行命令来启动服务。

我这里为我自己的集群编写了一个启动zookeeper、hdfs、hbase的脚本,如下:
clipboard.png

这里需要注意以下几点(亲测):
1) 如果是本节点的服务,那么可以直接执行命令也可以通过ssh免密登录后再执行命令;
2) 如果是其他节点的服务,那么就需要先通过ssh登录该节点,然后执行开启服务的命令,需特别注意,ssh免密登录命令必须与开启服务的命令在同一行,这样执行后会自动退出返回原节点,继续执行脚本中的下一条命令;如果ssh免密登录命令与登录后要执行的命令不在同一行,那么结果就是登录到目标节点而已,无法自动执行下面的命令,显然这样并不是我们的目标,所以谨记,ssh命令要与登录后执行的命令在同一行,即这两个命令之间不能有换行符;
3) 因为bash执行命令时,需要到环境变量配置的目录下去依次查找该命令是否存在,所以ssh免密登录后,需要使环境变量对该bash shell有效,有两种做法:
3.1) 将环境变量添加到~/.bashrc中,因为对登录用户而言,每次开启一个新的bash shell都会加载这个用户的.bashrc文件,所以将环境变量添加到这里,那么新的bash shell就可以识别到所使用的命令了;
3.2) 像上面我的脚本中写的,直接使用source /etc/profile命令,使profile文件立即生效,即对ssh免密登录的bash shell立即生效,这样子bash shell才能通过环境变量去查找当前要执行的命令是否存在;
4) ssh免密登录命令后的要执行的命令是否要添加引号的问题,我试过了:
如果为它添加单引号或者双引号,那么执行结果都是正常且是正确的;但是我还是发现了它们之 间的一点不同之处:命令加单引号的,服务启动起来比较慢,而改为加双引号后,服务启动起来就快了一点。

你可能感兴趣的:(如何在集群中的一个节点上执行命令操控该集群的另一个节点或一些节点,这里就涉及到ssh免密登录服务了)