批量管理自動化運維100臺小規(guī)模服務(wù)器
一、腳本背景介紹
在企業(yè)中經(jīng)常會用遇到小規(guī)模的集群服務(wù)器,在日常的管理中經(jīng)常會遇到重復(fù)性的動作,如更新備上百臺服務(wù)器上的ssh公鑰、備份上百臺服務(wù)器上的/etc/passwd配置文件等等,通常情況下采用專用自動化運維工具assibe,若因資源或技術(shù)因素沒有安裝此類服務(wù),此時可以通過腳本實現(xiàn)小規(guī)模服務(wù)器集群的自動化運維,記住只要是重復(fù)3次以上的動作,在自動化運維的時代里必須采用自動化手法進行運維管理。
二、腳本制作技術(shù)需求
2.1 SSH免密碼登陸認證
服務(wù)器的遠程管理認證通常有兩種方式認證,
***種采用對稱加密算法的賬號密碼登錄認證,對稱加密即加密和解密使用同一個密鑰,最常見的算法有DES(Data Encryption Standard)、3DES、AES(Advanced Encryption Standard)等,優(yōu)勢為加密和解密使用同一個密碼,效率高,缺點是密鑰交換無安全保障,數(shù)據(jù)來源無法確認。
第二種采用非對稱加密算法,利用密鑰完成認證,非對稱加密算法通常有RSA、DSA,其主要作用是生成公鑰和私鑰,公鑰加密的數(shù)據(jù)只能私鑰解密,私鑰加密的數(shù)據(jù)只能是公鑰解密(數(shù)字簽名),通過私鑰能算出公鑰,但通過公鑰無法推算出私鑰,具體原理見如下:
ssh-keygen命令用來生成公鑰和私鑰密鑰對的工具,通常用法如下
- [root@centos7 ~]#ssh-keygen -t rsa -f .ssh/id_rsa #生成秘鑰對
- Generating public/private rsa key pair.
- Enter passphrase (empty for no passphrase): #如若選擇給私鑰加口令,則在每次使用時,提供口令
- Enter same passphrase again: 時,在使用時需輸入口令,如不輸入口令時,需保護好
- Your identification has been saved in .ssh/id_rsa.口令,一旦丟失相當于***鑰匙。
- Your public key has been saved in .ssh/id_rsa.pub.
- The key fingerprint is:
- 37:18:3a:18:f7:43:f1:b0:59:5a:75:88:29:bf:ac:5d root@centos7.location.com
- [root@centos7 ~]#ls .ssh/ #驗證生成的密鑰對
- id_rsa id_rsa.pub known_hosts
- [root@centos7 ~]#ssh-copy-id -i .ssh/id_rsa.pub root@192.168.100.128 #將密鑰上傳到免登陸服務(wù)器,
- 自動加載到/root/.ssh目錄
- ####################################################################################################
- [root@centos6 ~]# ifconfig eth0
- eth0 Link encap:Ethernet HWaddr 00:0C:29:AD:7B:C1
- inet addr:192.168.100.128 Bcast:192.168.100.255 Mask:255.255.255.0
- [root@centos6 ~]# ls .ssh/ #驗證發(fā)現(xiàn)通過ssh-copy-id上傳,自動將key定義為authorized.keys
- authorized_keys known_hosts #上傳到服務(wù)器的公鑰自動更名的依據(jù)可查看/etc/ssh/ssh_config
- ################################此時完成免密碼登錄認證##############################################
2.2 Expect實現(xiàn)key分發(fā)
在上百臺服務(wù)器中,對公鑰分發(fā)不可能經(jīng)過上百次的手工輸入key,像前文所述在在自動化運維時代里超過3次的動作必須用自動化思想實現(xiàn)自動化運維。
Expect是交互式語言,具體學(xué)習(xí)可參考http://www.tcl.tk
2.3 pssh家族命令詳解
pssh提供了子工具,可以實現(xiàn)多臺服務(wù)器的批量管理,如同時在多臺主機上批量執(zhí)行某命令,管理同步進程,高效的復(fù)制文件,需要注意的是:使用pssh命令時,命令參數(shù)中不支持變量(如$HOSTNAME)和通配符(如*)等,如果命令參數(shù)中有變量和通配符時,pssh會人為是執(zhí)行本地的命令,而非遠程主機的命令。下面將常用命令及選項逐一介紹
pssh命令詳解:
- [root@centos7 ~]#pssh -H root@192.168.100.128 -i "sed -i "s/SELINUX=enforcing/SELINUX=disabled/" /etc/selinux/config" #通過pssh批量關(guān)閉seLinux,在此僅舉例一個
- [root@centos7 ~]#pssh -H root@192.168.100.128 -i setenforce 0 #批量發(fā)送指令
- [1] 01:33:24 [SUCCESS] 192.168.100.128
- [root@centos7 ~]#pssh -H xuewb@192.168.100.128 -i hostname
- [1] 01:41:00 [FAILURE] xuewb@192.168.100.128 Exited with error code 255
- Stderr: pssh error: SSH requested a password. Please create SSH keys or use
- the -A option to provide a password.
- Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
- [root@centos7 ~]#pssh -H xuewb@192.168.100.128 -A -i hostname #當不支持ssh的key認證時,通過
- Warning: do not enter your password if anyone else has superuser -A選項,使用密碼認證批量執(zhí)行指令
- privileges or access to your account.
- Password:
- [1] 01:41:12 [SUCCESS] xuewb@192.168.100.128
- centos6.localdomain
- [root@centos7 /app]#pssh -H 192.168.100.128 -o /app -e /app -i "hostname"
- #將標準錯誤和標準正確重定向都保存至/app目錄下
PSCP.PSSH命令詳解
pscp.pssh功能是將本地文件批量復(fù)制到遠程主機,其語法結(jié)構(gòu)為:
pscp [-vAr] [-h hosts_file] [-H [user@]host[:port]] [-l user] [-p par] [-o outdir] [-e errdir] [-t timeout] [-O options] [-x args] [-X arg] local remote
選項用法pssh的選項與pssh保持一致,scp選項如下,舉例說明:
顯示復(fù)制過程 |
||
復(fù)制過程中保留常規(guī)屬性 |
||
遞歸復(fù)制目錄 |
- [root@centos7 ~]#pscp.pssh -H 192.168.100.128 /root/test/curl.sh /app/
- [1] 03:22:05 [SUCCESS] 192.168.100.128 #將本地curl.sh 復(fù)制到/app/目錄
- [root@centos7 ~]#pscp.pssh -h host.txt /root/test/curl.sh /app/
- [1] 03:22:05 [SUCCESS] 192.168.100.128 #將本地curl.sh 批量復(fù)制到/app/目錄
- [root@centos7 ~]#pscp.pssh -H 192.168.100.128 /root/test/mcurl.sh /root/test/mysql.sh /app/
- [1] 03:39:17 [SUCCESS] 192.168.100.128 #將本地多個文件批量復(fù)制到/app/目錄
- [root@centos7 ~]#pscp.pssh -H 192.168.100.128 -r /root/test/ /app/
- [1] 03:40:41 [SUCCESS] 192.168.100.128 #將本地目錄批量復(fù)制到/app/目錄
PSLURP.PSSH命令詳解
pslurp.pssh功能是將遠程主機的文件批量復(fù)制到本地,在復(fù)制過程中注意
pslurp [-vAr] [-h hosts_file] [-H [user@]host[:port]] [-l user] [-p par][-o outdir] [-e errdir] [-t timeout] [-O options] [-x args] [-X arg] [-L localdir] remote local(本地名)
指定從遠程主機下載文件存儲的目錄,local是下載到本地后的名稱,語法結(jié)構(gòu)中必須跟local |
||
-a |
||
- [root@centos7 ~]#pslurp -H 192.168.100.128 -L /app/ -r /app/test test(存儲到本地后的名稱)
- [1] 04:14:13 [SUCCESS] 192.168.100.128 #批量下載服務(wù)器中的文檔到本地,-L指定下 載目錄,local存儲到本地的名稱
- [root@centos7 ~]#pslurp -H 192.168.100.128 -L /app/ /app/mcurl.sh mcurl.sh
- [1] 04:13:13 [SUCCESS] 192.168.100.128 #批量下載服務(wù)器中文檔到本地
- [root@centos7 ~]#pslurp -H 192.168.100.128 -L /app/ /etc/passwd pawd
- [1] 04:23:39 [SUCCESS] 192.168.100.128 #批量下載目標服務(wù)器的passwd文件,下載到本地更名為pawd
三、腳本功能及實現(xiàn)過程
3.1 腳本運行環(huán)境
服務(wù)器集群環(huán)境或百臺左右服務(wù)器的管理,如若太多服務(wù)器得借助專業(yè)運維工具assible。
3.2 腳本功能介紹
腳本在自動化運維通常實現(xiàn)如下功能:
(1)批量執(zhí)行命令,并將結(jié)果返回終端或日志文件;
(2)文件批量復(fù)制,將本地的文件批量上傳給遠程主機;
(3)文件批量下載,將遠程主機的文件批量下載至本地;
3.3 腳本編寫思路
自動化運維腳本的編寫思路:
***步:生成key,利用Expect將公鑰分發(fā)給服務(wù)器;
第二步:利用pscp.pssh向遠程主機(主機列表文件)推送腳本
第三步:利用pssh遠程主機發(fā)送執(zhí)行腳本指令
第四步:利用pslurp.pssh回收腳本及日志文件,針對性進行處理
3.4 腳本編寫案例
***步:編寫Expect腳本,實現(xiàn)key的上傳
- #!/bin/expect
- #
- if { $argc != 2 } {
- send_user "usage: send-rsa-id file host \n"
- exit
- }
- #define var
- set password wbxue.blog
- set file [lindex $argv 0 ]
- set ip [lindex $argv 1 ]
- #start exec command
- spawn ssh-copy-id -i $file root@$ip
- expect {
- "yes/on" {send "yes\r";exp_continue}
- "*password*" {send "$password\r"}
- }
- expect eof
第二步:利用bash腳本調(diào)用Expect腳本批量給服務(wù)器上傳(此時已實現(xiàn)免密碼登錄)
- #!/bin/bash
- file=/root/.ssh/id_rsa.pub
- net=192.168.100
- ip=$net.$n
- for n in {1..255};do
- expect send-rsa-pub.exp $file $ip
- done
第三步:編寫業(yè)務(wù)腳本(腳本腳本***生產(chǎn)相關(guān)日志文件,有利用回收日志進行相關(guān)處理)檢測磁盤的使用率
- #!/bin/bash
- >/var/log/diskcheck.log
- df |grep "/dev/sd" |while read disk ;do
- diskused=`echo $disk|sed -r 's/.* ([0-9]+)%.*/\1/'`
- devname=`echo $disk |cut -d " " -f1`
- [ $diskused -ge 1 ] && echo "$devname will be full:$diskused%" >> /var/log/diskcheck.log
- done
第四步:推送腳本、發(fā)送執(zhí)行腳本指令、定期回收腳本日志進行處理
- [root@centos7 ~]#pscp.pssh -H 192.168.100.128 /root/diskcheck.sh /app/
- [root@centos7 ~]#pssh -H root@192.168.100.128 -i bash /app/diskcheck.sh
- [root@centos7 ~]#pslurp -H 192.168.100.128 -L /app/ /var/log/diskcheck.log diskcheck.log
當然也可以通過批量執(zhí)行命令進程處理,但是通過批量執(zhí)行命令處理相對效率較慢,因此推薦使用腳本處理業(yè)務(wù),如上為舉例說明的一個案例,其他業(yè)務(wù)具體情況可以通過替換此案例中的腳本來實現(xiàn)各位運維界兄弟們的需求。