我寫了一個指令碼,可在“任意”伺服器上執行命令!

冰河發表於2021-09-25

大家好,我是冰河~~

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

別急,我們今天就是來解決這個問題的。

說實話,我在維護上千臺伺服器叢集的時候,並沒有去依次手動登入每臺伺服器,為啥?沒錯,就是因為我懶啊!我懶的去登入,並且依次登入那麼多臺伺服器,整個人都會崩潰的。

於是,我就想辦法能不能寫個指令碼,讓這個指令碼接收我要執行的命令,然後將命令依次分發到叢集上所有的伺服器中執行,這不就解決問題了嗎?說幹就幹。

不過,這裡,有個需要注意的地方:那就是:需要提前配置好叢集中每臺伺服器的主機名和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分鐘之內就搞定了。所以,效率和質量才是做事情需要追求的目標。

好了,今天就到這兒吧,我是冰河,我們下期見~~

相關文章