1. 程式人生 > >企業實戰腳本案例3:批量管理自動化運維100臺小規模服務器

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

linux pssh ssh

批量管理自動化運維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,其主要作用是生成公鑰和私鑰,公鑰加密的數據只能私鑰解密,私鑰加密的數據只能是公鑰解密(數字簽名),通過私鑰能算出公鑰,但通過公鑰無法推算出私鑰,具體原理見如下:

技術分享

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

命令

選項

含義

ssh-keygen

-t

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

-p

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

-q

靜默輸出此

-f

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

ssh-copy-id

-i

指定公鑰所在位置

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

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

自動加載到/root/.ssh目錄

####################################################################################################

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

[[email protected] ~]# 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 “[email protected] [email protected] ”

-i

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

-o

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

-e

指定錯誤輸出目錄

-l

指定以某用戶的方式登錄等價於[email protected]中的user

-A

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

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

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

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

[[email protected] ~]#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).

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

[[email protected] /app]#pssh -H 192.168.100.128 -o /app -e /app -i "hostname"

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

PSCP.PSSH命令詳解

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

pscp [-vAr] [-h hosts_file] [-H [[email protected]]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

遞歸復制目錄
[[email protected] ~]#pscp.pssh -H 192.168.100.128 /root/test/curl.sh /app/

[1] 03:22:05 [SUCCESS] 192.168.100.128 #將本地curl.sh 復制到/app/目錄

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

[1] 03:22:05 [SUCCESS] 192.168.100.128 #將本地curl.sh 批量復制到/app/目錄

[[email protected] ~]#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/目錄

[[email protected] ~]#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 [[email protected]]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 “[email protected] [email protected] ”

-r

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

[[email protected] ~]#pslurp -H 192.168.100.128 -L /app/ -r /app/test test(存儲到本地後的名稱)
[1] 04:14:13 [SUCCESS] 192.168.100.128 #批量下載服務器中的文檔到本地,-L指定下 載目錄,local存儲到本地的名稱
[[email protected] ~]#pslurp -H 192.168.100.128 -L /app/ /app/mcurl.sh mcurl.sh
[1] 04:13:13 [SUCCESS] 192.168.100.128 #批量下載服務器中文檔到本地
[[email protected] ~]#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 [email protected]$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

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

[[email protected] ~]#pscp.pssh -H 192.168.100.128 /root/diskcheck.sh /app/

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

[[email protected] ~]#pslurp -H 192.168.100.128 -L /app/ /var/log/diskcheck.log diskcheck.log

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

本文出自 “每天進步一點點,自律” 博客,請務必保留此出處http://wbxue.blog.51cto.com/11831715/1964165

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