共计 1486 个字符,预计需要花费 4 分钟才能阅读完成。
大家好,我是冰河~~
冰河之前保护着上千台服务器组成的服务器集群,如果每次须要在服务器上执行命令的时候,都要手动登录每台服务器进行操作的话,那也太麻烦了。你想想,如果在上千台服务器的集群中,每台服务器中只须要简略的执行一个雷同的命令,那别说执行命令了,就是让你顺次手动登录上千台服务器,那也够你受的了。预计顺次登录上千台服务器,给你三天工夫你可能都登不完,那怎么办呢?有没有什么好的办法来解决这个问题呢?
别急,咱们明天就是来解决这个问题的。
说实话,我在保护上千台服务器集群的时候,并没有去顺次手动登录每台服务器,为啥?没错,就是因为我懒啊!我懒的去登录,并且顺次登录那么多台服务器,整个人都会解体的。
于是,我就想方法能不能写个脚本,让这个脚本接管我要执行的命令,而后将命令顺次散发到集群上所有的服务器中执行,这不就解决问题了吗?说干就干。
不过,这里,有个须要留神的中央:那就是:须要提前配置好集群中每台服务器的主机名和 IP 地址的对应关系,可能相互应用主机名进行通信,并配置了 SSH 免明码登录。这一点不行放心,只有让运维在布局和调配服务器的时候,布局好就行了,无需前面再顺次登录服务器解决。
为了不便小伙伴们了解,这里咱们就假如集群中存在 1024 台服务器,每台服务器的主机名为 binghe1~binghe1024。每台服务器能够通过主机名进行通信,接下来,我写了一个名称为 distribute_command.sh 的脚本,内容如下所示。
#!/bin/bash
pcount=$#
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 分钟之内就搞定了。所以,效率和品质才是做事件须要谋求的指标。
好了,明天就到这儿吧,我是冰河,咱们下期见~~