大家好,我是冰河~~
冰河之前維護著上千臺服務器組成的服務器集群,如果每次需要在服務器上執行命令的時候,都要手動登錄每臺服務器進行操作的話,那也太麻煩了,你想想,如果在上千臺服務器的集群中,每臺服務器中只需要簡單的執行一個相同的命令,那別說執行命令了,就是讓你依次手動登錄上千臺服務器,那也夠你受的了,估計依次登錄上千臺服務器,給你三天時間你可能都登不完,那怎么辦呢?有沒有什么好的方法來解決這個問題呢?

別急,我們今天就是來解決這個問題的,
說實話,我在維護上千臺服務器集群的時候,并沒有去依次手動登錄每臺服務器,為啥?沒錯,就是因為我懶啊!我懶的去登錄,并且依次登錄那么多臺服務器,整個人都會崩潰的,

于是,我就想辦法能不能寫個腳本,讓這個腳本接收我要執行的命令,然后將命令依次分發到集群上所有的服務器中執行,這不就解決問題了嗎?說干就干,
不過,這里,有個需要注意的地方:那就是:需要提前配置好集群中每臺服務器的主機名和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分鐘之內就搞定了,所以,效率和質量才是做事情需要追求的目標,

好了,今天就到這兒吧,我是冰河,大家有啥問題可以在下方留言,也可以加我微信:sun_shine_lyz,我拉你進群,一起交流技術,一起進階,一起進大廠~~
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/274183.html
標籤:其他
