案例十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
相关文章
相关标签/搜索