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