案例十六、自動化運維-批量關Tomcat服務

生產環境中往往在多臺機器上運行同一個服務(Tomcat),此案例的需求是批量地關閉多臺機器上的Tomcat服務。假設場景:

1)提供一個機器IP和Tomcat用戶的密碼列表(/data/ip-passwd.txt),格式如下:

10.111.222.101 passwd1

10.111.222.102 passwd2

10.111.222.103 passwd3

......

2)Tomcat所在路徑:/opt/tomcat/

3)關閉Tomcat服務的命令:/opt/tomcat/bin/shutdown.sh

4)遠程機器上只有tomcat一個Java應用,即進程Java只是關於Tomcat的


知識點一:expect腳本登錄遠程機器

expect是Unix/Linux系統中用來進行自動化控制和測試的軟件工具,它是Tcl腳本語言的一個擴展,應用在交互式軟件中,如telnet,ftp,ssh,rsync等。下面是用expect腳本登錄遠程機器的示例:

#!/usr/bin/expect
#定義變量
set passwd "123abc321"
#執行命令
spawn ssh [email protected]
#與遠程機器交互 截取特定信息 發送變量
expect {
"yes/no" { send "yes\r";exp_continue }
"password:" { send "$passwd\r" }
}
interact

說明:set爲設置變量的指令,passwd爲變量名,後面是變量的值。spawn後面爲要執行的shell命令(比如ssh、rsync等)。expect{ }裏爲交互過程,首次ssh登錄一臺機器時,會問我們是否繼續登錄,expect會傳遞一個yes指令,並且回車(\r),之後再一次交互(exp_continue),然後就會提示我們輸入該主機的密碼,expect會把$passwd傳遞給它,然後就能正常登錄該主機了。expect{ }裏面,只需要寫局部關鍵詞即可,例如本例中只寫了“password:”。最後一行interact的作用是,登錄主機後停留在遠程的機器上,而不退出。


知識點二:expect腳本登錄遠程機器並執行命令

登錄機器後,還可以在遠程的機器上執行命令,示例:

#!/usr/bin/expect
set host "192.168.80.102"
set passwd "aaa123bbb"
spawn ssh user1@$host
expect {
"yes/no" {send "yes\r";exp_continue}
"password:" {send "$passwd\r"}
}
expect "]*"
send "touch /tmp/test.aa\r"
expect "]*"
send "echo 111 >/tmp/test.aa\r"
expect "]*"
send "exit\r"

說明:這裏的']*'包含了']#'或者']$',這樣不管是root用戶還是普通用戶,都可以匹配到。


知識點三:給expect腳本傳遞參數

expect腳本可以像shell腳本那樣接收外部傳遞的參數,在shell中用$1表示第一個參數,$2表示第二個參數,以此類推。但在expect腳本中,有所不同,示例:

#!/usr/bin/expect
set host [lindex $argv 0]
set passwd [lindex $argv 1]
spawn ssh root@$host
expect {
    "yes/no" {send "yes\r"}
    "password:" {send "$passwd\r"}
}
interact

說明:expect的第一個參數用[lindex $argv 0]表示,第二個參數用[lindex $argv 1]表示,以此類推。


本案例參考腳本

#!/bin/bash
#批量關閉遠程機器上的Tomcat服務
#作者:
#日期:
ipfile=/data/ip-passwd.txt
cat >> kill_tomcat.exp <<EOF
#!/usr/bin/expect
set passwd [lindex \$argv 0]
set host [lindex \$argv 1]
spawn ssh  tomcat@\$host
expect {
     "yes/no" { send "yes\r"; exp_continue}
     "password:" { send "\$passwd\r" }
}
expect "]*"
send "/opt/tomcat/bin/shutdown.sh\r"
expect "]*"
send "if ps aux |grep -q tomcat; then killall -9 java; fi"
expect "]*"
send "exit\r"
EOF
chmod a+x kill_tomcat.exp
cat $ipfile | while read line
do
  ip=`echo $line|awk  '{print $1}'`
  pw=`echo $line|awk '{print $2}'`
  ./kill_tomcat.exp $pw $ip
done

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章