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

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

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

10.111.222.101 passwd1tomcat

10.111.222.102 passwd2bash

10.111.222.103 passwd3ssh

......ide

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

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

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


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

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

#!/usr/bin/expect
#定義變量
set passwd "123abc321"
#執行命令
spawn ssh root@192.168.10.11
#與遠程機器交互 截取特定信息 發送變量
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
相關文章
相關標籤/搜索