1. 程式人生 > 其它 >自動化批量管理工具 pssh

自動化批量管理工具 pssh

pssh提供OpenSSH和相關工具的並行版本。包括pssh,pscp,prsync,pnuke和pslurp。該專案包括psshlib,可以在自定義應用程式中使用。

pssh是python寫的可以併發在多臺機器上批量執行命令的工具,它的用法可以媲美ansible的一些簡單用法,執行起來速度比ansible快它支援檔案並行複製,遠端命令執行,殺掉遠端主機上的程序等等。

殺手鐗是檔案並行複製,,當進行再遠端主機批量上傳下載的時候,最好使用它。pssh用於批量ssh操作大批量機器;pssh是一個可以在多臺伺服器上執行命令的工具,同時支援拷貝檔案,是同類工具中很出色的;比起for迴圈的做法,更推薦使用pssh!

使用pssh的前提是:必須在本機與其他客戶機上配置好金鑰認證訪問(即ssh無密碼登入信任關係)。

下面就說下使用pssh進行批量操作的記錄:

1)安裝pssh

yum install -y pssh

2)pssh用法

-h      執行命令的遠端主機列表檔案 
-H      user@ip:port 檔案內容格式[user@]host[:port]
-l      遠端機器的使用者名稱
-p      一次最大允許多少連線
-o      輸出內容重定向到一個檔案
-e      執行錯誤重定向到一個檔案
-t      設定命令執行的超時時間
-A      提示輸入密碼並且把密碼傳遞給ssh(注意這個引數新增後只是提示作用,隨便輸入或者不輸入直接回車都可以)
-O      設定ssh引數的具體配置,參照ssh_config配置檔案
-x      傳遞多個SSH 命令,多個命令用空格分開,用引號括起來
-X      同-x 但是一次只能傳遞一個命令
-i      顯示標準輸出和標準錯誤在每臺host執行完畢後
-I      讀取每個輸入命令,並傳遞給ssh程序 允許命令指令碼傳送到標準輸入

新版命令已變更為:

Usage: parallel-ssh [OPTIONS] command [...]

Options:
  --version             show program's version number and exit
  --help                show this help message and exit
  -h HOST_FILE, --hosts=HOST_FILE
                        hosts file (each line "[user@]host[:port]")
  -H HOST_STRING, --host=HOST_STRING
                        additional host entries ("[user@]host[:port]")
  -l USER, --user=USER  username (OPTIONAL)
  -p PAR, --par=PAR     max number of parallel threads (OPTIONAL)
  -o OUTDIR, --outdir=OUTDIR
                        output directory for stdout files (OPTIONAL)
  -e ERRDIR, --errdir=ERRDIR
                        output directory for stderr files (OPTIONAL)
  -t TIMEOUT, --timeout=TIMEOUT
                        timeout (secs) (0 = no timeout) per host (OPTIONAL)
  -O OPTION, --option=OPTION
                        SSH option (OPTIONAL)
  -v, --verbose         turn on warning and diagnostic messages (OPTIONAL)
  -A, --askpass         Ask for a password (OPTIONAL)
  -x ARGS, --extra-args=ARGS
                        Extra command-line arguments, with processing for
                        spaces, quotes, and backslashes
  -X ARG, --extra-arg=ARG
                        Extra command-line argument
  -i, --inline          inline aggregated output and error for each server
  --inline-stdout       inline standard output for each server
  -I, --send-input      read from standard input and send as input to ssh
  -P, --print           print output as we get it

Example: pssh -h hosts.txt -l irb2 -o /tmp/foo uptime

新舊命令對應:

parallel-nuke   --> pnuke
parallel-rsync  --> prsync
parallel-scp    --> pscp
parallel-slurp  --> pslurp
parallel-ssh    --> pssh

3)pssh例項說明

hosts.txt檔案內容如下:
(列表檔案內的資訊格式是“ip:埠”,如果本機和遠端機器使用的ssh埠一致,則可以省去埠,直接用ip就行。不過建議還是將埠都帶上為好。)

192.168.1.101:22
192.168.1.109:22
192.168.1.118:25791
192.168.1.105:25791

如上四臺機器放在一個列表檔案hosts.txt內,本機已經和這四臺機器做了ssh無密碼登陸的信任關係

注意:列表檔案內的機器必須提前和本機做好ssh信任關係,如果沒有做的話,那麼pssh批量執行時,輪到這臺沒有做信任關係的機器時就不會執行。

a)批量執行命令

pssh -h hosts.txt -l root -i 'uptime'

如果新增-A引數,那麼即使提前做了ssh信任關係,還是會提示輸入密碼!

pssh -h hosts.txt -l root -i -A 'uptime'
pssh -h hosts.txt -l root -i -t 10 -o /root/pssh.log 'uptime && date'

b)批量上傳檔案或目錄(pscp)

批量上傳本地檔案/mnt/test.file到遠端伺服器上的/tmp目錄:

pscp -l root -h hosts.txt /mnt/test.file /tmp/

批量上傳本地檔案/mnt/test.file、/mnt/aa.file、/mnt/bb.file到遠端伺服器上的/tmp目錄:

pscp -l root -h hosts.txt /mnt/test.file /mnt/aa.file /mnt/bb.file /tmp/
或者:
pscp -l root -h hosts.txt /mnt/{test.file,aa.file,bb.file} /tmp/

批量上傳本地目錄/mnt/zhong到遠端伺服器上的/tmp目錄(上傳目錄需要新增-r引數):

pscp -l root -h hosts.txt -r /mnt/zhong /tmp/

批量上傳本地目錄/mnt/zhong、/mnt/aa、/mnt/vv到遠端伺服器上的/tmp目錄

pscp -l root -h hosts.txt -r /mnt/zhong /mnt/aa /mnt/vv /tmp/
或者:
pscp -l root -h hosts.txt -r /mnt/{zhong,aa,vv} /tmp/

c)批量下載檔案或目錄(pslurp)

批量下載伺服器上的某檔案到本地,不用擔心重名問題,因為pslurp已經建立了以檔案列表內的ip為名稱的目錄來存放下載的檔案:

pslurp -l root -h hosts.txt /etc/hosts .

另外特別注意:
上面的批量下載操作,只能下載到本地的當前目錄下,不能在命令中跟指定的路徑:
pslurp -l root -h hosts.txt /etc/hosts /mnt/

要想下載到本機的/mnt目錄下,正確的做法是先切換到/mnt目錄下,然後再執行下載命令:(列表檔案要跟全路徑)

pslurp -l root -h /root/hosts.txt /etc/hosts ./

上面是批量下載檔案,要是批量下載目錄,只需要新增一個-r引數即可!

pslurp -l root -h /root/hosts.txt -r /home/ ./

d)批量同步(prsync)

同步本機/mnt/test目錄下的檔案或目錄到遠端機器的/mnt/test路徑下

prsync -l root -h hosts.txt -r /mnt/test/ /mnt/test/

同步本機/mnt/test目錄下的檔案或目錄到遠端機器的/mnt路徑下

prsync -l root -h hosts.txt -r /mnt/test/ /mnt/

【注意:上面批量同步目錄操作是將本機對應目錄資料同步到遠端機器上,遠端機器上對於目錄下多餘的檔案也會保留(不會刪除多餘檔案)】

同理,批量同步檔案操作,去掉-r引數。

【注意:同步檔案的時候,其實就是完全覆蓋,遠端機器對應檔案內的檔案會被全部替換!】

如下:同步本機的/mnt/test/file檔案內容到遠端伺服器/mnt/test/file檔案內

prsync -l root -h hosts.txt /mnt/test/file /mnt/test/file
prsync -l root -h hosts.txt /mnt/test/file /mnt/aaa

e)批量kill遠端機器上的程序(pnuke)

比如批量kill掉遠端機器上的nginx程序

pnuke -h hosts.txt -l root nginx
作者:Varden 出處:http://www.cnblogs.com/varden/ 本文內容如有雷同,請聯絡作者! 本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利。