2010年12月20日 星期一

遠端將所有的 SERVER 關機

因為我們機房的環境蠻惡劣的
空調有時都會停掉,使得我不得不將所有的主機關機等待空調回復
如果一台一台關的話會太慢,所以得要開發一個 script 程式,只要執行這隻程式就會依照IP設定遠端關機。

第1步驟:
設定無需密碼即可登入遠端之帳號

在被控端 Server 建立帳號並設定密碼
#useradd poweroff
#passwd poweroff

備註:控制端 Server 最好之能用 "root" 身份才能使用遠端關機的 script,以下教學皆以 root 身份執行

在控制端 Server 上登入"root" 建立金鑰

#ssh-keygen -t rsa
以下訊息直接按 "Enter" 即可

完成後在 root 家目錄下的 ".ssh" 隱藏目錄中會有 "id_rsa" "id_rsa.pub" 這兩個檔案

#ls ~/.ssh/
id_rsa id_rsa.pub

將 id_rsa.pub 複製到被控端的 "poweroff" 使用者中的家目錄裡的 ".ssh" 隱藏目錄中,並改名成 "authoriezd_keys" 即可

#scp /root/.ssh/id_rsa.pub poweroff@192.168.1.100:/home/poweroff/.ssh/authorized_keys

備註:帳號新建立時在家目錄中並無 ".ssh" 這目錄,需使用者自行建立
(poweroff)$mkdir ~/.ssh

完成複製後請用 ssh 遠端登入確定不需密碼即可登入被控端

第2步驟:
將 poweroff 使用者加入 sudo 並不需使用密碼即可執行 root 指令,但需限制可使用之指令

編輯 sudoer 檔案,並加入以下文字
#visudo
...
...
..
poweroff ALL=(root) NOPASSWD:/sbin/shutdown, /bin/sync
..
..

說明:poweroff 使用 sudo 指令時,身份為 root 並不需要輸入密碼,但只能執行 shutdown 和 sync 指令

以上兩步驟完成後即可使用 ssh 指令下達被控端關機

如:
#ssh poweroff@192.168.1.100 'sudo /bin/sync;sudo /bin/sync;sudo /bin/sync;sudo /sbin/shutdown -h now'

第3步驟:
將遠端關機指令寫成 script 檔案

如果直接在 shell script 的檔案中直接打入"ssh poweroff@192.168.1.100 指令"時
它並不會像直接用 root 身份在終端機執行時可以不用密碼
在執行這隻 script 時它還是會詢問帳號密碼

以下分為兩部份

第1部份:

我們要需要安裝 expect 這套軟體來執行 "expext shell" 才能達到執行 script 時不詢問密碼
#vi remote.sh

#!/usr/bin/expect -f
set username "poweroff"
set password "1qaz&UJM"
set ipaddr "192.168.1.226"
set timeout -1
spawn ssh $username@$ipaddr /usr/bin/sudo /bin/sync;
/usr/bin/sudo /bin/sync;/usr/bin/sudo /bin/sync;/usr/bin/sudo /sbin/shutdown -h now
match_max 100000
expect eof

說明:
1. username:遠端帳號。
2. password:遠端密碼。
3. ipaddr:遠端IP位址。
4. timeout:設定命令超時時間。
5. spawn:所要執行的程式。
6. match_max:設定所收到的資料量大小。

第2部份:

另外再寫一個 script 檔案將所要關機的 Server IP 寫入檔案中
#vi shudownAll.sh
#!/bin/bash
network=192.168.1.
serverip=(100 20 15)
account=poweroff
for((i=0;i<${#serverip[@]};i++)) do ip=$network${serverip[$i]} ping -c 1 -w 1 $ip &> /dev/null && result=0 || result=1
if [ "$result" == 0 ];then
echo $ip" is UP."
search=`cat remote.sh | grep '192' | sed 's/^.*\ "//g' | sed 's/\".*$//g'`
cat remote.sh | grep '192' | sed 's/^.*\ "//g' | sed 's/\".*$//g' |sed -i 's/'$search'/'$ip'/g' remote.sh
/root/remote.sh
else
echo $network${serverip[$i]}" is DOWN."
fi
done

完成後將兩隻程式的的權限改為 "root" 身份才能執行

#chmod 700 shutdownAll.sh remote.sh

執行 shutdownAll.sh
#./shutdownAll.sh

備註:
完成以上步驟後執行程式會出現以下訊息
sudo: sorry, you must have a tty to run sudo
這時需編輯 sudoer 檔,將 Defaults requiretty 註解起來

#vi /etc/sudoers
..
..
..
#Defaults requiretty <== 在前面加 "#" 註解起來
..
..
就不會發生錯誤訊息了!!


說明:
執行 shutdownAll.sh 後會依照 "serverip" 中所設定的 ip 用 sed 指令將 "remote.sh" 中的 "ipaddr",更換成 "serverip" 。

之後只要在 shutdownAll.sh 裡,在 "serverip" 加入新的 ip 即可將遠端 server 關機

沒有留言: