有个业务需求,需要在服务器上安装一个Agent,安装Agent其实很简单,但是顶不住服务器数量太多,所以不可能一台台的登上去安装,所以写了个脚本可以实现批量自动化安装
1、脚本实现的功能
根据提供的IP地址和Root密码,自动完成SSH登录后,执行安装命令,完成Agent的安装
2、脚本使用前提条件
①密码文件:将IP地址和Root密码单独写到一个文件中,默认为root用户登录,所以只需要两列既可,如下所示:
格式:IP地址 Root密码
②expect安装:有些服务器可能没有安装这个工具,可以通过yum源进行安装,执行/usr/bin/expect这个命令成功既可。
3、脚本使用说明
脚本直接执行既可,登录成功后需要运行的命令以及结尾部分对日志的分析,可以根据自己的实际需求进行更改,此脚本最重要的内容就是expect这个工具,可以将本是交互的命令写到一个过程中实现自动执行。脚本比较简单,其实就是实现一个ssh的自动化登录功能。
4、脚本内容
#!/bin/bash
Log=/tmp/install_agent.log
PW_File=/tmp/password.txt
while read line
do
host=`echo $line|gawk '{print $1}'`
password=`echo $line|gawk '{print $2}'`
/usr/bin/expect >> ${Log} 2>&1 <
set timeout 5
spawn ssh root${host}
expect {
"*yes/no" { send "yes\r"; exp_continue }
"*assword:" { send "${password}\r" }
}
expect {
"Permisstion*" { send_user "\n${host} is password error\n" }
}
set timeout 2
expect {
"*#" { send "需要执行的命令,如pwd\r";set timeout 120(如果命令需要执行较长时间可设置) }
}
expect {
"*#" { send "exit\r" }
}
expect eof
EOF
done
Exist_Agent=`grep -E "^easyops -is exist|^spawn" ${Log} |grep -B 1 "^easyops is exist"|grep -o "[0-9.]\{2,\}"`
Success_Agent=`grep -E "\bstart success\b|^spawn" ${Log}|grep -B 1 "\bstart success\b" |grep -o "[0-9.]\{2,\}"`
echo ${Exist_Agent} easyops is exist
echo ${Success_Agent} agent install success
for ip in `gawk '{print $1}' ${PW_File}`
do
echo ${Exist_Agent} ${Success_Agent} |grep -w "${ip}" > /dev/null 2>&1
if [ $? -ne 0 ];then
echo ${ip} is install failed
fi
done
5、脚本Tips
set timeout:设定超时时间,如果超过这个时间,expect就不会再期待定义的字符串
spawn:启动一个子进程来执行命令,如ssh
expect:期待出现的字符串,可以使用通配符,如“*password:”,这里每个expect我都用{}进行组合,因为网上的教程都是直接用expect+send,但是我试了好几次一直无法成功匹配,不知道是哪里配置有问题,最后用这种方法解决。
send:当出现了expect定义的字符串后,发送定义的内容,如执行的命令“pwd\r”,\r表示发送了命令后敲的回车键