写点什么

我写了一个脚本,可在“任意”服务器上执行命令!

用户头像
冰河
关注
发布于: 刚刚
我写了一个脚本,可在“任意”服务器上执行命令!

大家好,我是冰河~~


冰河之前维护着上千台服务器组成的服务器集群,如果每次需要在服务器上执行命令的时候,都要手动登录每台服务器进行操作的话,那也太麻烦了。你想想,如果在上千台服务器的集群中,每台服务器中只需要简单的执行一个相同的命令,那别说执行命令了,就是让你依次手动登录上千台服务器,那也够你受的了。估计依次登录上千台服务器,给你三天时间你可能都登不完,那怎么办呢?有没有什么好的方法来解决这个问题呢?



别急,我们今天就是来解决这个问题的。


说实话,我在维护上千台服务器集群的时候,并没有去依次手动登录每台服务器,为啥?没错,就是因为我懒啊!我懒的去登录,并且依次登录那么多台服务器,整个人都会崩溃的。



于是,我就想办法能不能写个脚本,让这个脚本接收我要执行的命令,然后将命令依次分发到集群上所有的服务器中执行,这不就解决问题了吗?说干就干。


不过,这里,有个需要注意的地方:那就是:需要提前配置好集群中每台服务器的主机名和 IP 地址的对应关系,能够互相使用主机名进行通信,并配置了 SSH 免密码登录。这一点不行担心,只要让运维在规划和分配服务器的时候,规划好就行了,无需后面再依次登录服务器处理。


为了方便小伙伴们理解,这里我们就假设集群中存在 1024 台服务器,每台服务器的主机名为 binghe1~binghe1024。每台服务器可以通过主机名进行通信,接下来,我写了一个名称为 distribute_command.sh 的脚本,内容如下所示。


#!/bin/bashpcount=$#if (( pcount<1 )) ; then  echo no args;  exit;fi#先在本机上执行命令echo ------------binghe$host-----------------$@#循环在集群中的远程节点上执行命令for (( host=1 ; host<=1024; host=host+1)) ; do  echo ------------binghe$host-----------------  ssh binghe$host $@done;
复制代码


这个脚本的含义为:接收传递进来的命令,将命令分发到主机名为 binghe1~binghe1024 的服务器上执行,也就是说,使用这个脚本我们能够做到:同时在集群的服务器上执行相同的命令。


接下来,为 distribute_command.sh 脚本赋予可执行权限,如下所示。


chmod a+x ./distribute_command.sh
复制代码


使用格式如下:


./distribute_command.sh 在服务器上执行的完整命令
复制代码


使用示例


  • 在集群中的每台服务器的/home 目录下创建 hello.txt 文,内容为 hello world


./distribute_command.sh echo "hello world" >> /home/hello.txt
复制代码


  • 查看集群中每台服务器上 hello.txt 文件的内容


./distribute_command.sh cat /home/hello.txt
复制代码


  • 删除集群中每台服务器上的 hello.txt 文件


./distribute_command.sh rm -rf /home/hello.txt
复制代码


是不是很简单啊?所以说,有时候,不要盲目的去执行。很多时候,在做事情之前,要先思考下有没有更好的解决方案,有没有效率更加高效的解决方案。就比如这篇文章上说的,在上千台服务器上执行一条命令,如果依次手动登录每台服务器执行命令,估计花三天时间都搞不定;如果我们写了一个脚本的话,估计也就 1 分钟之内就搞定了。所以,效率和质量才是做事情需要追求的目标。



好了,今天就到这儿吧,我是冰河,我们下期见~~

发布于: 刚刚阅读数: 2
用户头像

冰河

关注

公众号:冰河技术 2020.05.29 加入

Mykit系列开源框架发起者、核心架构师和开发者,《海量数据处理与大数据技术实战》与《MySQL开发、优化与运维实战》作者。【冰河技术】微信公众号作者。

评论

发布
暂无评论
我写了一个脚本,可在“任意”服务器上执行命令!