LazyManage[shell版]批量管理

       LazyManage運維批量系統管理腳本,可自定義執行批量命令,批量執行腳本,批量傳送文件或文件夾及自定義操做等。在腳本屢次改動完善的過程當中,其實各類功能皆可經過執行命令或執行腳原本完成,因此沒有添加任何實際性的功能,徹底讓運維人員自定義操做。python

       LazyManage 算是個批量系統管理的模板,更多功能你們可根據須要自行定義,以便更適合不一樣生產環境或重複性較大的工做。自定義操做靈活,能夠匹配配置文件只針對相應IP操做。
git

      腳本採用dialog圖形選擇界面,操做方便,能夠返回選擇。更重要的是避免腳本去控制鍵盤,dialog的函數獲得操做者的選擇變量,加以判斷,便可截取對應IP,執行相應操做。
github

      基於ssh普通用戶後su執行操做。同時支持普通用戶已建立密鑰(密鑰加密碼也支持)後su操做,無需任何改動。web

      全部密碼輸入由expect交互完成。已判斷ssh和scp操做中可能遇到的各類錯誤狀況。(如想了解expect作其餘操做,也能夠參考下此腳本交互,相信會有點幫助)shell

後臺併發執行,提升效率。
bash


歡迎你們試用!我的能力有限,不免考慮不周,望你們提出寶貴的意見!
意見及BUG交流羣: 198173206
腳本製做: 雪松  六子
併發

郵箱:quanzhou722@163.com
運維


下載地址:  https://github.com/liquanzhou/ops_docssh


#!/bin/bash
#ShellName:LazyManage.sh
#Conf:serverlist.conf
#By:peter.li six
#2013-11-28
#LazyManage.sh version update address:
#http://hi.baidu.com/quanzhou722/item/4ccf7e88a877eaccef083d1a
#shell examples manual:
#http://hi.baidu.com/quanzhou722/item/f4a4f3c9eb37f02d46d5c0d9
#python examples manual:
#http://hi.baidu.com/quanzhou722/item/cf4471f8e23d3149932af2a7
LANG="en_US.UTF-8"
while true
do
Set_Variable(){
ServerList=serverlist.conf
Port=22
TimeOut="-1"
Task=30
RemoteUser='peterli'
RemotePasswd='123456'
RemoteRootUser='root'
RemoteRootPasswd='xuesong'
KeyPasswd=''
ScpPath="lazy.txt"
ScpRemotePath="/tmp/"
ScriptPath="Remote.sh"
}
System_Check(){
#Kill the CTRL + z sleep process
if [ "$1" == kill ];then
    ps -eaf |awk '$NF~/.*'${0##*/}'/&&$6~/tty|pts.*/{print $2}' |xargs -t -i kill -9 {}
    exit
fi
#Check the configuration file
if [ ! -s serverlist.conf ];then
    echo "error:IP list serverlist.conf file does not exist or is null"
    exit
fi
#rpm check
for i in dialog expect
do
    rpm -q $i >/dev/null
    [ $? -ge 1 ] && echo "$i does not exist,Please root yum -y install $i to install,exit" && exit
done
#The current user
#LazyUser=`whoami`
#LazyManage path
LazyPath=`pwd`
#System parameters
#BitNum=`getconf LONG_BIT`
#SystemNum=`lsb_release -a|grep Release |awk '{print $2}'`
}
Select_Type() {
while true
do
clear
    case $Operate in
    1)
        Type=`dialog --no-shadow --stdout --backtitle "LazyManage" --title "System work content"  --menu "select" 10 60 0 \
        1a "[Common operations]" \
        0 "[exit]"`
    ;;
    2)
        Type=`dialog --no-shadow --stdout --backtitle "LazyManage" --title "Custom work content"  --menu "select" 10 60 0 \
        1b "[web upgrade]" \
        2b "[db   manage]" \
        0 "[exit]"`
    ;;
    0)
        echo -e "\e[34mLazyManage exit\e[m"
        exit
    ;;
    esac
    [ $? -eq 0 ] && Select_Work $Type || break
done
}
Select_Work() {
while true
do
clear
    case $Type in
    1a)
        Work=`dialog --no-shadow  --stdout --backtitle "LazyManage" --title "Common operations" --menu "select" 20 60 0 \
        1aa "[custom cmd ]" \
        2aa "[scp file   ]" \
        3aa "[exec script]" \
        0 "[exit]"`
    ;;
    1b)
        Work=`dialog --no-shadow  --stdout --backtitle "LazyManage" --title "web upgrade" --menu "select" 20 60 0 \
        1ba "[job1]" \
        2ba "[job2]" \
        3ba "[job3]" \
        0 "[exit]"`
    ;;
    2b)
        Work=`dialog --no-shadow  --stdout --backtitle "LazyManage" --title "db   manage" --menu "select" 20 60 0 \
        1bb "[job1]" \
        2bb "[job2]" \
        3bb "[job3]" \
        0 "[exit]"`
    ;;
    0)
        echo -e "\e[34mLazyManage exit\e[m"
        exit
    ;;
    esac
    [ $? -eq 0 ] && Get_Ip $Work || break
done
}
Get_Ip(){
while true
do
clear
case $Work in
[1-9]a[a-z])
    List=`awk '$1!~"^#"&&$1!=""{print $1" "$1" on"}' $ServerList`
;;
1ba)
    List=`awk '$1!~"^#"&&$1!=""&&$2=="job1"&&$3=="web"{print $1" "$2"_"$3" on"}' $ServerList`
;;
2ba)
    List=`awk '$1!~"^#"&&$1!=""&&$2=="job2"&&$3=="web"{print $1" "$2"_"$3" on"}' $ServerList`
;;
3ba)
    List=`awk '$1!~"^#"&&$1!=""&&$2=="job3"&&$3=="web"{print $1" "$2"_"$3" on"}' $ServerList`
;;
1bb)
    List=`awk '$1!~"^#"&&$1!=""&&$2=="job1"&&$3=="db"{print $1" "$2"_"$3" on"}' $ServerList`
;;
2bb)
    List=`awk '$1!~"^#"&&$1!=""&&$2=="job2"&&$3=="db"{print $1" "$2"_"$3" on"}' $ServerList`
;;
3bb)
    List=`awk '$1!~"^#"&&$1!=""&&$2=="job3"&&$3=="db"{print $1" "$2"_"$3" on"}' $ServerList`
;;
0)
    echo -e "\e[34mLazyManage exit\e[m"
    exit
;;
*)
    echo "Dialog list does not exist"
    break
;;
esac
IpList=`dialog --no-shadow  --stdout --backtitle "LazyManage" --title "ip list" --separate-output --checklist "select IP" 0 60 0 $List |sort -u`
if [ "X$IpList" == "X" ];then
    break
fi
Message=`cat <<EOF
Please make sure the information
========================
$IpList
========================
EOF`
dialog --backtitle "LazyManage" --title "Confirm IP" --no-shadow --yesno "$Message" 20 60
[ $? -eq 0 ] && Perform || break
done
}
Perform(){
    LogDir="$LazyPath/lazylog/`date +%Y%m%d`"
    LogPath="$LogDir/lazy_`date +%H_%M_%S`.log"
    mkdir -p $LogDir
    Total=0
    case $Work in
    1aa)
        echo -e '\e[35mPlease enter the custom command[backspace=ctrl+backspace]: \e[m'
        while read Cmd
        do
            if [ X"$Cmd" != X ];then
                break
            fi
            echo 'Please type the command again[backspace=ctrl+backspace]'
        done
        echo -e "\e[33m`date +%Y-%m-%d_%H:%M` Perform Custom_Cmd: ${Cmd} \e[m"|tee -a $LogPath
        Concurrent Interactive_Auth Ssh_Cmd
    ;;
    2aa)
        if [ ! -e ${ScpPath} ];then
            echo "${ScpPath} file or directory does not exist "
            read
            break
        fi
        echo -e "\e[33m`date +%Y-%m-%d_%H:%M` Perform Scp_File: ${ScpPath}-${ScpRemotePath} \e[m"|tee -a $LogPath
        Concurrent Interactive_Auth Scp_File
    ;;
    3aa)
        echo -e "\e[33m`date +%Y-%m-%d_%H:%M` Perform Exec_Script: ${ScriptPath} \e[m"|tee -a $LogPath
        Concurrent Interactive_Auth Ssh_Script
    ;;
    [1-9]ba)
        echo "custom"
    ;;
    [1-9]bb)
        echo "custom"
    ;;
    *)
        echo "Dialog list does not exist"
        break
    ;;
    esac
    Failure=`grep -wc 'Ssh_Error:' $LogPath`
    echo -e "\e[35m`date +%Y-%m-%d_%H:%M` All Operation_Complete: Total[$Total] Successful[`expr $Total - $Failure`] Failure[$Failure] \e[m"|tee -a $LogPath
    sed -i -r -e 's/\r//g' -e '/Custom_Cmd:|Scp_File:|Exec_Script:|Ssh_Error:|Ssh_Done:|Operation_Complete:/s/^.....|....$//g' $LogPath
    read
}
Concurrent(){
FifoFile="$$.fifo"
mkfifo $FifoFile
exec 6<>$FifoFile
rm $FifoFile
for ((i=0;i<=$Task;i++));do echo;done >&6
for Ip in $IpList
do
    read -u6
    ((Total++))
    {
        $1 $2 |awk 'BEGIN{RS="(expect_start|expect_eof|expect_failure)"}END{print $0}' |sed -e '1d' -e '/Connection to.*closed/d' |tee -a $LogPath
        echo >&6
    } &
done
wait
exec 6>&-
}
Interactive_Auth(){
#RemoteRootPasswd=`awk '$1=='$Ip'{print $5}' $ServerList`
/usr/bin/expect -c "
proc jiaohu {} {
    send_user expect_start
    expect {
        password {
            send ${RemotePasswd}\r;
            send_user expect_eof
            expect {
                \"does not exist\" {
                    send_user expect_failure
                    exit 10
                }
                password {
                    send_user expect_failure
                    exit 5
                }
                Password {
                    send ${RemoteRootPasswd}\r;
                    send_user expect_eof
                    expect {
                        incorrect {
                            send_user expect_failure
                            exit 6
                        }
                        eof
                    }
                }
                eof
            }
        }
        passphrase {
            send ${KeyPasswd}\r;
            send_user expect_eof
            expect {
                \"does not exist\" {
                    send_user expect_failure
                    exit 10
                }
                passphrase{
                    send_user expect_failure
                    exit 7
                }
                Password {
                    send ${RemoteRootPasswd}\r;
                    send_user expect_eof
                    expect {
                        incorrect {
                            send_user expect_failure
                            exit 6
                        }
                        eof
                    }
                }
                eof
            }
        }
        Password {
            send ${RemoteRootPasswd}\r;
            send_user expect_eof
            expect {
                incorrect {
                    send_user expect_failure
                    exit 6
                }
                eof
            }
        }
        \"No route to host\" {
            send_user expect_failure
            exit 4
        }
        \"Invalid argument\" {
            send_user expect_failure
            exit 8
        }
        \"Connection refused\" {
            send_user expect_failure
            exit 9
        }
        \"does not exist\" {
            send_user expect_failure
            exit 10
        }
            
        \"Connection timed out\" {
            send_user expect_failure
            exit 11
        }
        timeout {
            send_user expect_failure
            exit 3
        }
        eof
    }
}
set timeout $TimeOut
switch $1 {
    Ssh_Cmd {
        spawn ssh -t -p $Port -o StrictHostKeyChecking=no $RemoteUser@$Ip /bin/su - $RemoteRootUser -c \\\"$Cmd\\\"
        jiaohu
    }
    Ssh_Script {
        spawn scp -P $Port -o StrictHostKeyChecking=no $ScriptPath $RemoteUser@$Ip:/tmp/${ScriptPath##*/};
        jiaohu
        spawn ssh -t -p $Port -o StrictHostKeyChecking=no $RemoteUser@$Ip /bin/su - $RemoteRootUser -c  \\\"/bin/sh /tmp/${ScriptPath##*/}\\\" ;
        jiaohu
    }
    Scp_File {
        spawn scp -P $Port -o StrictHostKeyChecking=no -r $ScpPath $RemoteUser@$Ip:${ScpRemotePath};
        jiaohu
    }
}
"
case $? in
0)    echo -e "\e[32m`date +%Y-%m-%d_%H:%M` $Ip Ssh_Done: ------------------------  OK \e[m"  ;;
1|2)  echo -e "failure\n\e[31m`date +%Y-%m-%d_%H:%M` $Ip Ssh_Error: expect grammar or unknown error \e[m"  ;;
3)    echo -e "failure\n\e[31m`date +%Y-%m-%d_%H:%M` $Ip Ssh_Error: connection timeout \e[m"  ;;
4)    echo -e "failure\n\e[31m`date +%Y-%m-%d_%H:%M` $Ip Ssh_Error: host not found \e[m"  ;;
5)    echo -e "failure\n\e[31m`date +%Y-%m-%d_%H:%M` $Ip Ssh_Error: user passwd error \e[m"  ;;
6)    echo -e "failure\n\e[31m`date +%Y-%m-%d_%H:%M` $Ip Ssh_Error: root passwd error \e[m"  ;;
7)    echo -e "failure\n\e[31m`date +%Y-%m-%d_%H:%M` $Ip Ssh_Error: key passwd error \e[m"  ;;
8)    echo -e "failure\n\e[31m`date +%Y-%m-%d_%H:%M` $Ip Ssh_Error: ssh parameter not correct \e[m"  ;;
9)    echo -e "failure\n\e[31m`date +%Y-%m-%d_%H:%M` $Ip Ssh_Error: ssh invalid port parameters \e[m"  ;;
10)   echo -e "failure\n\e[31m`date +%Y-%m-%d_%H:%M` $Ip Ssh_Error: root user does not exist \e[m"  ;;
11)   echo -e "failure\n\e[31m`date +%Y-%m-%d_%H:%M` $Ip Ssh_Error: ssh timeout  \e[m"  ;;
esac
}
trap "" 2 3
System_Check $1
Set_Variable
#Script entrance
Operate=`dialog --no-shadow --stdout --backtitle "LazyManage" --title "manipulation menu"  --menu "select" 10 60 0 \
1 "[system operate]" \
2 "[custom operate]" \
0 "[exit]"`
[ $? -eq 0 ] && Select_Type $Operate || exit
done
#End
相關文章
相關標籤/搜索