企業實戰腳本案例3:批量管理自動化運維100臺小規模服務器

 批量管理自動化運維100臺小規模服務器


目錄

1.腳本背景介紹

2.腳本技術需求分析

   2.1 SSH免登陸認證

   2.2 Expect實現key分發

   2.2 PSSH家族命令詳解

3.腳本功能及實現過程

   3.1 腳本運行環境介紹

   3.2 腳本功能介紹

   3.3 腳本編寫思路

   3.4 腳本編寫案例


一、腳本背景介紹

    在企業中經常會用遇到小規模的集羣服務器,在日常的管理中經常會遇到重複性的動作,如更新備上百臺服務器上的ssh公鑰、備份上百臺服務器上的/etc/passwd配置文件等等,通常情況下采用專用自動化運維工具assibe,若因資源或技術因素沒有安裝此類服務,此時可以通過腳本實現小規模服務器集羣的自動化運維,記住只要是重複3次以上的動作,在自動化運維的時代裏必須採用自動化手法進行運維管理。

二、腳本製作技術需求

   2.1 SSH免密碼登陸認證

    服務器的遠程管理認證通常有兩種方式認證,

    第一種採用對稱加密算法的賬號密碼登錄認證,對稱加密即加密和解密使用同一個密鑰,最常見的算法有DES(Data Encryption Standard)、3DES、AES(Advanced Encryption Standard)等,優勢爲加密和解密使用同一個密碼,效率高,缺點是密鑰交換無安全保障,數據來源無法確認。

    第二種採用非對稱加密算法,利用密鑰完成認證,非對稱加密算法通常有RSA、DSA,其主要作用是生成公鑰和私鑰,公鑰加密的數據只能私鑰解密,私鑰加密的數據只能是公鑰解密(數字簽名),通過私鑰能算出公鑰,但通過公鑰無法推算出私鑰,具體原理見如下:

wKiom1mz9gfy2An7AAGQQGK7cDE763.jpg

    ssh-keygen命令用來生成公鑰和私鑰密鑰對的工具,通常用法如下

命令

選項

含義

ssh-keygen

-t

指定創建的密鑰對的加密算法,默認爲rsa

-p

輸入舊的密碼,在新建密鑰對時不加此選項,但可更新現有私鑰的密碼

-q

靜默輸出此

-f

指定輸出路徑,ssh免密鑰登錄時,必須在/root/.ssh/目錄下

ssh-copy-id

-i

指定公鑰所在位置

[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 [email protected]

[root@centos7  ~]#ls .ssh/                #驗證生成的密鑰對
 id_rsa
   id_rsa.pub   known_hosts
 [root@centos7 ~]#ssh-copy-id -i .ssh/id_rsa.pub [email protected]
  #將密鑰上傳到免登陸服務器

                                                                                                              自動加載到/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/     #驗證發現通過ssh-copy-id上傳,自動將key定義爲authorized.keys
 authorized_keys
   known_hosts   #上傳到服務器的公鑰自動更名的依據可查看/etc/ssh/ssh_config

################################此時完成免密碼登錄認證##############################################

    2.2 Expect實現key分發

    在上百臺服務器中,對公鑰分發不可能經過上百次的手工輸入key,像前文所述在在自動化運維時代裏超過3次的動作必須用自動化思想實現自動化運維。

    Expect是交互式語言,具體學習可參考http://www.tcl.tk

   2.3 pssh家族命令詳解

    pssh提供了子工具,可以實現多臺服務器的批量管理,如同時在多臺主機上批量執行某命令,管理同步進程,高效的複製文件,需要注意的是:使用pssh命令時,命令參數中不支持變量(如$HOSTNAME)和通配符(如*)等,如果命令參數中有變量和通配符時,pssh會人爲是執行本地的命令,而非遠程主機的命令。下面將常用命令及選項逐一介紹

    pssh命令詳解:

命令

選項

含義

Pssh

-h

指定文件中用戶主機列表

-H

指定主機,-H “root@host1 root@host2 ”

-i

將每個主機標準輸出輸送到當前終端

-o

指定正確的標準輸出目錄,如果-i顯示過多,可以選擇指定輸出某個目錄,並自動創建以IP命名的文本用來保存輸出。

-e

指定錯誤輸出目錄

-l

指定以某用戶的方式登錄等價於user@host1中的user

-A

Key的認證基於用戶,如若沒有對某些用戶認證key,但是要批量操作加用此選項表示啓用密碼登錄認證

[root@centos7  ~]#pssh -H [email protected]  -i  "sed -i "s/SELINUX=enforcing/SELINUX=disabled/"  /etc/selinux/config"                           #通過pssh批量關閉seLinux,在此僅舉例一個

[root@centos7  ~]#pssh -H [email protected]  -i  setenforce 0  #批量發送指令

[1] 01:33:24  [SUCCESS] 192.168.100.128

[root@centos7  ~]#pssh -H [email protected]  -i  hostname

[1] 01:41:00  [FAILURE] [email protected] 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 [email protected]  -A -i  hostname   #當不支持ssh的key認證時,通過

Warning: do not  enter your password if anyone else has superuser  -A選項,使用密碼認證批量執行指令

privileges or  access to your account.

Password:

[1] 01:41:12  [SUCCESS] [email protected]

centos6.localdomain

[root@centos7  /app]#pssh -H 192.168.100.128 -o /app -e /app   -i "hostname"

                                                     #將標準錯誤和標準正確重定向都保存至/app目錄下

   PSCP.PSSH命令詳解

    pscp.pssh功能是將本地文件批量複製到遠程主機,其語法結構爲:

    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選項如下,舉例說明:

命令

選項

含義


  Pscp-pssh

            -v

顯示覆制過程

            -a

複製過程中保留常規屬性

            -r

遞歸複製目錄
[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 複製到/app/目錄

[root@centos7 ~]#pscp.pssh -h host.txt  /root/test/curl.sh /app/

[1] 03:22:05 [SUCCESS] 192.168.100.128                      #將本地curl.sh 批量複製到/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                      #將本地多個文件批量複製到/app/目錄

[root@centos7 ~]#pscp.pssh -H 192.168.100.128  -r /root/test/ /app/
[1] 03:40:41 [SUCCESS] 192.168.100.128                     
#將本地目錄批量複製到/app/目錄

    PSLURP.PSSH命令詳解

   pslurp.pssh功能是將遠程主機的文件批量複製到本地,在複製過程中注意

   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(本地名)

命令

選項

含義


Pslurp-pssh

            -L

指定從遠程主機下載文件存儲的目錄,local是下載到本地後的名稱,語法結構中必須跟local
            -a

指定主機,-H “root@host1 root@host2 ”

            -r

將每個主機標準輸出輸送到當前終端

[root@centos7 ~]#pslurp -H 192.168.100.128 -L /app/ -r /app/test test(存儲到本地後的名稱)
[1] 04:14:13 [SUCCESS] 192.168.100.128                      #批量下載服務器中的文檔到本地,-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                      #批量下載服務器中文檔到本地
[root@centos7 ~]#pslurp -H 192.168.100.128 -L /app/ /etc/passwd pawd
[1] 04:23:39 [SUCCESS] 192.168.100.128      #批量下載目標服務器的passwd文件,下載到本地更名爲pawd

三、腳本功能及實現過程

   3.1 腳本運行環境

    服務器集羣環境或百臺左右服務器的管理,如若太多服務器得藉助專業運維工具assible。

   3.2 腳本功能介紹

    腳本在自動化運維通常實現如下功能:

      (1)批量執行命令,並將結果返回終端或日誌文件;

      (2)文件批量複製,將本地的文件批量上傳給遠程主機;

    (3)文件批量下載,將遠程主機的文件批量下載至本地;

    3.3 腳本編寫思路

     自動化運維腳本的編寫思路:

     第一步:生成key,利用Expect將公鑰分發給服務器;

     第二步:利用pscp.pssh向遠程主機(主機列表文件)推送腳本

     第三步:利用pssh遠程主機發送執行腳本指令

     第四步:利用pslurp.pssh回收腳本及日誌文件,針對性進行處理

   3.4 腳本編寫案例

     第一步:編寫Expect腳本,實現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腳本調用Expect腳本批量給服務器上傳(此時已實現免密碼登錄)

   #!/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    
 

  第三步:編寫業務腳本(腳本腳本最好生產相關日誌文件,有利用回收日誌進行相關處理)檢測磁盤的使用率

#!/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

    第四步:推送腳本、發送執行腳本指令、定期回收腳本日誌進行處理

[root@centos7 ~]#pscp.pssh -H 192.168.100.128  /root/diskcheck.sh /app/

[root@centos7 ~]#pssh -H [email protected]  -i  bash /app/diskcheck.sh

[root@centos7 ~]#pslurp -H 192.168.100.128 -L /app/ /var/log/diskcheck.log diskcheck.log

    當然也可以通過批量執行命令進程處理,但是通過批量執行命令處理相對效率較慢,因此推薦使用腳本處理業務,如上爲舉例說明的一個案例,其他業務具體情況可以通過替換此案例中的腳本來實現各位運維界兄弟們的需求。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章