虽说做了好几年运维,但心里还是把自己当个写代码滴,对几年前就火热的自动化运维没正眼瞧过。
今年维护的主机终于扩到10台了,每台部署的业务都还不完全相同,每次需要全部重启那个头疼呀,决定自己写个远程一键重启的脚本让自己省点心,写个博客记录一下,不然半年准忘!
思路大概就是选其中一台主机配ssh公钥的方式可免密码登录其他都有所有主机,在此主机上部署脚本及配置文件实现多级菜单可视化的选择,最终通过ssh去执行目标主机的一个编写好的重启脚本达到重启目标主机的应用。
#!/bin/bash
#--------------------------------------------------------------------
# Fuction:程序启停脚本
# Version: 1.0
# Created: ****
# Created date:2017/11/14
# Modify history:
#--------------------------------------------------------------------
. /****/****/.bash_profile
source ./pubFuncXml.sh
trap '' INT
if [ ! -f $listfile ]
then
echo "[ERROR]list.ini不存在!退出"
exit;
fi
if [ ! -f $hostfile ]
then
echo "[ERROR]host.xml不存在!退出"
exit;
fi
#生成一级菜单
createMenu1(){
declare -a numArray=();
echo -e "\n-----------请根据菜单提示开始重启应用-----------------"
echo "接口应用:"
i=0
for tag in "${projArray[@]}"
do
numArray[${i}]=$i
echo " (${i}) $tag"
i=$(($i+1))
done
echo " (x) Exit"
echo "----------------------------------"
checkInput=true
while $checkInput; do
read -p "请选择:" input
if echo "${numArray[@]}" | grep -w "$input" &>/dev/null; then
checkInput=false
else
##退出
if [ ! -z $input ] && [ $input == 'x' ];then
exit 0;
fi
echo -e "输入不合法,请重新输入\n"
fi
done
i=0
for tag in "${projArray[@]}"
do
if [ $input == $i ];then
getHostConfig ip v_ip $tag
#将ip信息转成数组
declare -a ipArray=();
k=0
while read line
do
ipArray[k++]=$line
done <<< "$v_ip"
createMenu2 $tag "${ipArray[*]}"
fi
i=$(($i+1))
done
}
# 生成二级菜单
# 参数1:项目 参数2:ip
createMenu2(){
declare -a numArray=();
hostip=$2
project=$1
echo -e "\n主机信息(${project}):"
i=0
for tag in ${hostip[@]}
do
numArray[${i}]=$i
echo " (${i}) $tag"
i=$(($i+1))
done
echo " (r) Return"
echo " (x) Exit"
echo "----------------------------------"
checkInput=true
while $checkInput; do
read -p "请选择:" input
if echo "${numArray[@]}" | grep -w "$input" &>/dev/null; then
checkInput=false
else
##返回
#if 括号的区别
if [ ! -z $input ] && [ ${input} == 'r' ];then
createMenu1
##退出
elif [ ! -z $input ] && [ $input == 'x' ];then
exit 0;
else
echo -e "输入不合法,请重新输入\n"
fi
fi
done
i=0
for tag in ${hostip[@]}
do
if [ $input == $i ];then
getHostConfig app v_app $project $tag
createMenu3 $project $tag $v_app "${hostip[*]}"
fi
i=$(($i+1))
done
}
# 生成三级菜单
# 参数1:项目 参数2:ip 参数3:应用 参数4:ip数组
createMenu3(){
declare -a numArray=();
applist=$3
ip=$2
project=$1
hostip=$4
apparr=(${applist//|/ })
echo -e "\n应用信息(${project}->${ip}):"
i=0
for tag in ${apparr[@]}
do
numArray[${i}]=$i
echo " (${i}) $tag"
i=$(($i+1))
done
echo " (r) Return"
echo " (x) Exit"
echo "----------------------------------"
checkInput=true
while $checkInput; do
read -p "请选择:" input
if echo "${numArray[@]}" | grep -w "$input" &>/dev/null; then
checkInput=false
else
##返回
if [ ! -z $input ] && [ $input == 'r' ];then
createMenu2 $project "${hostip[*]}"
##退出
elif [ ! -z $input ] && [ $input == 'x' ];then
exit 0;
else
echo -e "输入不合法,请重新输入\n"
fi
fi
done
i=0
for tag in ${apparr[@]}
do
#if [ ! -z $input ] && [ $input == $i ];then
if [ $input == $i ];then
createMenu4 $project $ip $applist "${hostip[*]}" $input
fi
i=$(($i+1))
done
}
# 生成四级菜单
# 参数1:项目 参数2:ip 参数3:应用数组 参数4:ip数组 参数5: app数组下标
createMenu4(){
project=$1
ip=$2
applist=$3
hostip=$4
arr_index=$5
getHostConfig user v_user $project $ip
getHostConfig cmd v_cmd $project $ip
getHostConfig consolelog v_clog $project $ip
getHostConfig tradelog v_tlog $project $ip
cmdarr=(${v_cmd//|/ })
rebcmd=${cmdarr[$arr_index]}
clogarr=(${v_clog//|/ })
clog=${clogarr[$arr_index]}
tlogarr=(${v_tlog//|/ })
tlog=${tlogarr[$arr_index]}
apparr=(${applist//|/ })
app=${apparr[$arr_index]}
echo -e "\n选择操作(${project}->${ip}->${app}):"
echo " (0) 重启"
echo " (1) 停"
echo " (2) 启"
echo " (3) 跟踪控制台日志"
echo " (4) 跟踪业务日志"
echo " (r) Return"
echo " (x) Exit"
echo "----------------------------------"
checkInput=true
while $checkInput; do
read -p "请选择:" input
case $input in
0)echo "开始重启程序"
#checkInput=false
procReboot $ip $v_user $rebcmd reboot
;;
1)echo "开始停程序"
#checkInput=false
procReboot $ip $v_user $rebcmd stop
;;
2)echo "开始启程序"
#checkInput=false
procReboot $ip $v_user $rebcmd start
;;
3)echo "跟踪控制台日志"
#checkInput=false
tailRemotelog $ip $v_user $clog
;;
4)echo "跟踪业务日志"
#checkInput=false
tailRemotelog $ip $v_user $tlog
;;
r)checkInput=false
createMenu3 $project $ip $applist "${hostip[*]}"
;;
x)exit 0
;;
$REPLY)createMenu4 $project $ip $applist "${hostip[*]}" $arr_index
;;
*)echo -e "输入不合法,请重新输入\n";;
esac
done
}
# ssh远程执行脚本
# 参数1:ip 参数2:用户 参数3:脚本命令 参数4:操作类型
procReboot()
{
ip=$1
user=$2
cmd=$3
type=$4
remoteCmd=`echo $cmd | awk -F "[()]" '{print $1}'`
cmdParams=`echo $cmd | awk -F "[()]" '{print $2}'`
para=(${cmdParams//,/ })
for tag in ${para[@]}
do
remoteCmd+=" "$tag
done
remoteCmd+=" "$type
echo "==>执行远程重启 目标主机[${ip}] 执行脚本[$remoteCmd]"
sleep 1
ssh ${user}@${ip} "$remoteCmd;" < /dev/null
}
# ssh远程tail日志文件
# 参数1:ip 参数2:用户 参数3:日志文件
tailRemotelog()
{
ip=$1
user=$2
logpath=$3
echo "==>执行远程重启 目标主机[${ip}] 执行脚本[tail -c 10240 $logpath]"
sleep 2
ssh ${user}@${ip} "tail -c 10240 $logpath;echo -e '\n'"
## ssh ${user}@${ip} <<EOF
## echo $logpath
## tail -f $logpath|while read line
## do
## echo $line
## if [ $logctr ];then
## break
## else
## echo $line
## fi
##
## done
#EOF
}
#初始化host参数
initHost $hostfile
createMenu1
写过这个真觉得自己shell基础不扎实,到处查该怎么用,还遇到了几个陷阱浪费了我不少时间。
1. echo "$xmlParam" 和 echo $xmlParam的区别
2.if [ ! -z $input ] && [ $input == 'x' ] 和 if [[ ! -z $input ] && [ $input == 'x' ]]的区别