読者です 読者をやめる 読者になる 読者になる

heyheytower

日々のメモです。誰かのお役に立てれば幸いです。

linux 複数台の電源・アップデート管理をコマンドラインから実行する

シェルスクリプト

f:id:maijou2501:20160909225226p:plain

目次

【目的】

リモートマシン複数台の電源・アップデート管理などを、一台の管理ホストからコマンドラインで行う。
管理はホスト calc0 が行い、管理される側は calc1, calc2,… ,calcX とする。

【方法】

  • リモートコマンド実行は RSH 鍵認証で行うので下準備を行う(パスワード無しのrootログインが可能)
  • 起動には WOL を用いる
  • 停止は /sbin/shutdown -h now & または pm-hibernate & を実行する
  • 再起動は上記の組み合わせで実行する
  • 疎通確認は各ノードへの ping を実行する
  • 複数ノードで任意コマンドを実行する
  • アップデートをコマンドラインから自動実行させる(起動->アップデート->停止、アップデートのみ、を選択可)
【リモートコマンド実行は SSH・RSH 鍵認証で行うので下準備を行う】

ubuntu12.04.3 で intel compiler + openMPI + NFSv4 + sun grid engine (beowulf 方式) - heyheytowerを参照ください。


【起動には WOL を用いる】

第135回 PowerWakeとgWakeOnLanでWake-on-LAN:Ubuntu Weekly Recipe|gihyo.jp … 技術評論社を参考に設定いたしました。
MAC アドレス・IPアドレス対比ファイル「/etc/ethers」が存在する前提です。
同じ電源タップから電源供給しているため、時間差起動させています。

/usr/local/bin/all-wake

#!/bin/bash
for i in `seq 1 3`
do
powerwake calc${i}
sleep 2
done


※そのままコマンド実行できるよう、下記コマンドを実行します。
 sudo chmod 700 /usr/local/bin/all-*
 sudo chown root:root /usr/local/bin/all-*

※seq の部分変更によって簡単に対象ホストを増やすことが可能です。


【停止は "/sbin/shutdown -h now &" または "/usr/sbin/pm-hibernate &" を実行する】

自分の環境では、calc3 は pm-hibernate で停止しないと、WOL が有効にならないため例外を記載し、下記の設定を行った。】
「/etc/host」が存在する前提です。

/usr/local/bin/all-down

#!/bin/bash
for i in `seq 1 3`
do
if (test ${i} -eq 3)
then
rsh root@calc${i} pm-hibernate &
else
rsh root@calc${i} /sbin/shutdown -h now &
fi
done

再起動は上記の組み合わせで実行する

/usr/local/bin/all-restart

#!/bin/bash
/usr/local/bin/all-down
sleep 10
/usr/local/bin/all-wake

【疎通確認は各ノードへの ping を実行する】

https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=5&cad=rja&ved=0CE4QFjAE&url=http%3A%2F%2Fwww.kroom.net%2Findex.php%3FLinux%252Fbash%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%2597%25E3%2583%2588%252F%25E7%2596%258E%25E9%2580%259A%25E7%25A2%25BA%25E8%25AA%258D%25E3%2583%2584%25E3%2583%25BC%25E3%2583%25AB&ei=3HCwUsXoIMH6oASFmoKwCw&usg=AFQjCNGacR32EEQ9eEVbMHs3OwEAc1vyLw&sig2=lEo9WHWTBc9HjV-2gsP5GAを参照した。
2回 ping 疎通を確認して、返答なしの場合に NG を返します。

/usr/local/bin/all-status

#!/bin/bash
for i in `seq 1 3`
do
if ! /bin/ping -c 1 -W 1 calc${i} 1>/dev/null 2>/dev/null ; then
sleep 1
if ! /bin/ping -c 1 -W 1 calc${i} 1>/dev/null 2>/dev/null ; then
echo "calc"${i}" : NG"
fi
else
echo "calc"${i}" : OK"
fi
done

コマンド実行例

ito@calc0:~$ all-status
calc1 : NG
calc2 : OK
calc3 : NG

【各ノードで任意コマンドを実行する】

設定ファイルの確認などで利用します。
引数確認を行い、ping疎通後に任意コマンドを実行します。

/usr/local/bin/all-wake

#!/bin/bash

if [ $# -ne 1 ];then
echo "usage: all-rsh 'uhost -a'"
exit 1
fi$

for i in `seq 1 3`
do
if /bin/ping -c 1 -W 1 calc${i} 1>/dev/null 2>/dev/null ; then
echo "calc"${i}" : OK"
rsh root@calc${i} "${1}"
else
echo "calc"${i}" : NG"
fi
done


コマンド実行例

ito@calc0:~$ all-rsh "uname -a"
calc1 : OK
Linux calc1 3.8.0-34-generic #49~precise1-Ubuntu SMP Wed Nov 13 18:05:00 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
calc2 : NG
calc3 : NG
ito@calc0:~$
ito@calc0:~$ all-rsh 'uname -a' "hostname"
usage: all-rsh 'uhost -a'
ito@calc0:~$
ito@calc0:~$ all-rsh
usage: all-rsh 'uhost -a'
ito@calc0:~$
ito@calc0:~$ all-rsh 'uname -a;cat /etc/debian_version'
calc1 : OK
Linux calc1 3.8.0-34-generic #49~precise1-Ubuntu SMP Wed Nov 13 18:05:00 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
wheezy/sid
calc2 : NG
calc3 : NG
ito@calc0:~$

【アップデートをコマンドラインから自動実行させる(起動->アップデート->停止、アップデートのみ、を選択可)】

ping 疎通を確認したのちに、引数「w」によって2通りのアップデートを行います。

コマンド実行例

all-update w (起動->アップデート->停止)
all-update (アップデートのみ)


/usr/local/bin/all-update

#!/bin/bash

if [ "${1}" = "w" ]; then
/usr/local/bin/all-wake
sleep 60
fi

for i in `seq 1 3`
do
if /bin/ping -c 1 -W 1 calc${i} 1>/dev/null 2>/dev/null ; then
echo "calc"${i}" : OK"
rsh root@calc${i} apt-get update
rsh root@calc${i} apt-get -y upgrade
rsh root@calc${i} apt-get -y dist-upgrade
rsh root@calc${i} apt-get -y install
rsh root@calc${i} apt-get -y autoremove
else
echo "calc"${i}" : NG"
fi
done

if [ "${1}" = "w" ]; then
/usr/local/bin/all-down
fi

※上記ではシークエンスにアップデートが実行されるので、台数が増えた場合は並列実行を考えないといけません。


【所感】

上記コマンド郡を利用することで、メインマシンの起動に合わせて他のマシンを起動・アップデートさせる設定を簡単に行うこともできますし、メインマシンの停止に他のマシンの停止を合わせることも可能です。
自分ではメンテンナンスに必須のコマンド郡になっています。
他の方にもぜひ活用いただければと。



以上。