大家好渠脉,我是冰河~~
冰河之前維護著上千臺服務(wù)器組成的服務(wù)器集群,如果每次需要在服務(wù)器上執(zhí)行命令的時候鳞青,都要手動登錄每臺服務(wù)器進行操作的話为朋,那也太麻煩了习寸。你想想,如果在上千臺服務(wù)器的集群中孵滞,每臺服務(wù)器中只需要簡單的執(zhí)行一個相同的命令鸯匹,那別說執(zhí)行命令了忽你,就是讓你依次手動登錄上千臺服務(wù)器,那也夠你受的了根蟹。估計依次登錄上千臺服務(wù)器,給你三天時間你可能都登不完伶贰,那怎么辦呢若锁?有沒有什么好的方法來解決這個問題呢悲龟?
別急须教,我們今天就是來解決這個問題的。
說實話乐疆,我在維護上千臺服務(wù)器集群的時候挤土,并沒有去依次手動登錄每臺服務(wù)器误算,為啥?沒錯筒占,就是因為我懶爸├纭这橙!我懶的去登錄导披,并且依次登錄那么多臺服務(wù)器,整個人都會崩潰的鹰晨。
于是模蜡,我就想辦法能不能寫個腳本,讓這個腳本接收我要執(zhí)行的命令闯传,然后將命令依次分發(fā)到集群上所有的服務(wù)器中執(zhí)行甥绿,這不就解決問題了嗎则披?說干就干。
不過骄呼,這里判没,有個需要注意的地方:那就是:需要提前配置好集群中每臺服務(wù)器的主機名和IP地址的對應(yīng)關(guān)系澄峰,能夠互相使用主機名進行通信,并配置了SSH免密碼登錄绸硕。這一點不行擔(dān)心魂毁,只要讓運維在規(guī)劃和分配服務(wù)器的時候,規(guī)劃好就行了咬崔,無需后面再依次登錄服務(wù)器處理垮斯。
為了方便小伙伴們理解只祠,這里我們就假設(shè)集群中存在1024臺服務(wù)器,每臺服務(wù)器的主機名為binghe1~binghe1024熊杨。每臺服務(wù)器可以通過主機名進行通信,接下來夷狰,我寫了一個名稱為distribute_command.sh的腳本郊霎,內(nèi)容如下所示。
#!/bin/bash
pcount=$#
if (( pcount<1 )) ; then
echo no args;
exit;
fi
#先在本機上執(zhí)行命令
echo ------------binghe$host-----------------
$@
#循環(huán)在集群中的遠程節(jié)點上執(zhí)行命令
for (( host=1 ; host<=1024; host=host+1)) ; do
echo ------------binghe$host-----------------
ssh binghe$host $@
done;
這個腳本的含義為:接收傳遞進來的命令进倍,將命令分發(fā)到主機名為binghe1~binghe1024的服務(wù)器上執(zhí)行猾昆,也就是說骡苞,使用這個腳本我們能夠做到:同時在集群的服務(wù)器上執(zhí)行相同的命令。
接下來贴见,為distribute_command.sh腳本賦予可執(zhí)行權(quán)限片部,如下所示霜定。
chmod a+x ./distribute_command.sh
使用格式如下:
./distribute_command.sh 在服務(wù)器上執(zhí)行的完整命令
使用示例
- 在集群中的每臺服務(wù)器的/home目錄下創(chuàng)建hello.txt文,內(nèi)容為hello world
./distribute_command.sh echo "hello world" >> /home/hello.txt
- 查看集群中每臺服務(wù)器上hello.txt文件的內(nèi)容
./distribute_command.sh cat /home/hello.txt
- 刪除集群中每臺服務(wù)器上的hello.txt文件
./distribute_command.sh rm -rf /home/hello.txt
是不是很簡單跋剿磨德?所以說剖张,有時候,不要盲目的去執(zhí)行。很多時候丰滑,在做事情之前倒庵,要先思考下有沒有更好的解決方案炫刷,有沒有效率更加高效的解決方案浑玛。就比如這篇文章上說的,在上千臺服務(wù)器上執(zhí)行一條命令顾彰,如果依次手動登錄每臺服務(wù)器執(zhí)行命令,估計花三天時間都搞不定筋搏;如果我們寫了一個腳本的話奔脐,估計也就1分鐘之內(nèi)就搞定了吁讨。所以,效率和質(zhì)量才是做事情需要追求的目標(biāo)建丧。
好了茶鹃,今天就到這兒吧闭翩,我是冰河,我們下期見~~