背景: 前一段时间公司的购置了一批企业级的无线AP,由于使用人数太多,运行一段时间后发现,无线还是经常掉线或者无法连上网络(有线不会出现这样的问题),这时候我们会对无线设备进行重启,重启之后设备恢复正常,无线网络也恢复ok,由此萌生想用自动化的方式对无线设备进行监控和自动定期对无线设备重启来保持无线网络的稳定。
无线设备型号: H3C WA2620i-AGN 和 Cisco Aironet 1240AG
目的: 1.自动监测无线设备的运行情况,当监测到无线设备不能连接到外网或者延迟很高时,重启无线设备。
2.每天中午12:30和下午18:30 定期对无线设备进行重启
思路: 核心就是模拟手工登陆无线设备,运行相关无线设备的命令,去判断无线设备的运行情况,来实现自动监测和重启,核心方式使用shell的expect函数,为什么使用shell,而不使用其他语言比如python,是因为它能快速的完成这个功能。
上图-> 自动重启无线设备图(H3C和Cisco )
上图-> 自动监测无线设备图(H3C和Cisco )-->丢包正常图(模拟登陆无线设备ping外网地址,延迟正常则无需重启等动作)
Cisco
H3C
上图-> 自动监测无线设备图(H3C和Cisco )-->丢包不正常图(模拟登陆无线设备ping外网地址,延迟不正常则需重启)
Cisco
H3C
代码如下:
#!/bin/bash #author: GaoMing #date: 2015-11-02 #qq: 530035210 #blog: http://my.oschina.net/pwd/blog # 无线设备定期重启和自动监测 logdir=/data/log/shell #日志路径 log=$logdir/log.log #日志文件 is_font=1 #终端是否打印日志: 1打印 0不打印 is_log=1 #是否记录日志: 1记录 0不记录 pingDes="223.5.5.5" #pingDes="8.8.8.8" datef(){ date "+%Y-%m-%d %H:%M:%S" } print_log(){ if [[ $is_log -eq 1 ]];then [[ -d $logdir ]] || mkdir -p $logdir echo "[ $(datef) ] $1" >> $log fi if [[ $is_font -eq 1 ]];then echo -e "[ $(datef) ] $1" fi } #H3C无线自动执行命令 #$1:无线IP,$2:无线账号,$3:无线密码,$4:要执行的命令 runH3C() { expect -c " spawn /usr/bin/telnet $1 23 set timeout -1 expect \"\*Username\*:\" send \"$2\r\" expect \"\*Password\*:\" send \"$3\r\" expect \"\*\>\" send \"$4 \r\" expect \"\*\>\" send \"quit\r\" expect eof " } #H3c无线重启 runH3cReboot() { expect -c " spawn /usr/bin/telnet $1 23 set timeout -1 expect \"\*Username\*:\" send \"$2\r\" expect \"\*Password\*:\" send \"$3\r\" expect \"\*\>\" send \"$4 \r\" expect \"\*\:\" send \"Y\r\" expect eof " } #Cisco无线自动执行命令 #$1:无线IP,$2:无线账号,$3:无线密码,$4:要执行的命令 runCisco() { expect -c " spawn /usr/bin/telnet $1 23 set timeout -1 expect \"\*Username\*:\" send \"$2\r\" expect \"\*Password\*:\" send \"$3\r\" expect \"\*\#\" send \"$4 \r\" expect \"\*\#\" send \"quit\r\" expect eof " } #Cisco无线重启 runCiscoReload() { expect -c " spawn /usr/bin/telnet $1 23 set timeout -1 expect \"\*Username\*:\" send \"$2\r\" expect \"\*Password\*:\" send \"$3\r\" expect \"\*\#\" send \"$4 \r\" expect \"\*\]\" send \"\r\" expect eof " } #整合H3C和Cisco无线自动执行 #$1:无线设备类型 $2:无线IP,$3:无线账号,$4:无线密码,$5:要执行的命令 runWirelessAction() { print_log "\t-----Start-----" int=1 while (( $int <= $# )) do eval i=\$$int if [[ $i == "" ]];then print_log "$FUNCNAME():参数(第$int个)为空,退出." exit fi let "int++" done print_log "$FUNCNAME():检测IP($3)($2)是否存在..." pingIP=$(ping -c 3 $3 |grep "3 received" |wc -l) if [[ $pingIP -eq 0 ]];then print_log "$FUNCNAME():$3无线的IP不存在或者宕机了,退出当前函数." return else print_log "$FUNCNAME():检测IP完成." fi case $1 in "restart") case $2 in "cisco") print_log "$FUNCNAME():开始重启无线思科设备..." reloadStr=$(runCiscoReload "$3" "$4" "$5" "$6") reloadStrResult=$(echo "$reloadStr"|grep "closed" |wc -l) if [[ $reloadStrResult -eq 1 ]];then print_log "$FUNCNAME(): IP为:$3的无线设备正在重启..." print_log "$FUNCNAME(): 设备返回的信息如下:\n\r$reloadStr" else print_log "$FUNCNAME(): IP为:$3的无线设备重启异常 \n\r return code:$reloadStrResult \n\r return Str:$reloadStr" fi print_log "$FUNCNAME():重启无线思科设备完成" ;; "h3c") print_log "$FUNCNAME():开始重启无线H3c设备..." runH3cReboot "$3" "$4" "$5" "$6" > /tmp/rebootStr.txt & sleep 5 rebootStr=$(cat /tmp/rebootStr.txt) rebootStrResult=$(cat /tmp/rebootStr.txt|grep "Continue" |wc -l) if [[ $rebootStrResult -eq 1 ]];then print_log "$FUNCNAME(): IP为:$3的无线设备正在重启..." print_log "$FUNCNAME(): 设备返回的信息如下:\n\r$rebootStr" else print_log "$FUNCNAME(): IP为:$3的无线设备重启异常 \n\r return code:$rebootStrResult \n\r return Str:$rebootStr" fi print_log "$FUNCNAME():重启无线H3c设备完成" ;; *) print_log "$FUNCNAME():暂不支持其他设备." ;; esac ;; "run") case $2 in "cisco") print_log "$FUNCNAME():开始操作无线思科设备($3)..." print_log "$FUNCNAME():开始在该设备执行命令($6)..." runReStr=$(runCisco "$3" "$4" "$5" "$6") returnPercent=$(echo $runReStr |grep "percent" |awk -F'percent' '{print $1}' |awk '{ print $NF}') print_log "$FUNCNAME():设备返回的信息如下:\n\r $runReStr" print_log "$FUNCNAME():ping包返回的成功百分比(5个包): $returnPercent%" if [[ $returnPercent -lt 50 ]];then print_log "$FUNCNAME():该无线设备的丢包率大于50%,开始重启该设备." runWirelessAction "restart" "cisco" "$3" "$4" "$5" "reload" fi print_log "$FUNCNAME():执行命令完成" ;; "h3c") print_log "$FUNCNAME():开始操作H3c设备($3)..." print_log "$FUNCNAME():开始在该设备执行命令($6)..." runReStr=$(runH3C "$3" "$4" "$5" "$6") returnPercent=$(echo "$runReStr" |grep "loss" |awk -F'.' '{print $1}') print_log "$FUNCNAME():ping包的丢包率(5个包):$returnPercent%" print_log "$FUNCNAME():设备返回的信息如下:\n\r $runReStr" if [[ $returnPercent -gt 50 ]];then print_log "$FUNCNAME():该无线设备的丢包率大于50%,开始重启该设备." runWirelessAction "restart" "h3c" "$3" "$4" "$5" "reboot" fi print_log "$FUNCNAME():执行命令完成" ;; esac ;; *) print_log "$FUNCNAME():暂不支持其他类型无线AP或参数." ;; esac } #自动监测和重启 #runWirelessAction "run" "cisco" "10.2.1.111" "admin" "password" "ping $pingDes" #runWirelessAction "run" "h3c" "10.2.1.112" "admin" "password" "ping $pingDes" #重启 #runWirelessAction "restart" "cisco" "10.2.1.111" "admin" "password" "reload" #runWirelessAction "restart" "h3c" "10.2.1.111" "admin" "password" "reboot"
自动监测和定期重启直接加入crontab即可使用