隨著企業IT基礎架構規模不斷擴張,業務也迅速擴大,企業人員要管理的和業務系統也迅速增加,從之前的幾十臺增加到上百臺甚至幾千臺。面對這么多的,要執行相同的系統配置操作,一臺一臺地部署顯然是不現實的,而通過寫腳本來完成,效率又十分低下,此時就需要一些自動化工具來批量完成。本文介紹輕量級利器pssh,工具小巧、使用簡單,但功能強大,可以為自動化提供強有力的支持。
1、pssh應用場景
pssh的全稱是parallel-ssh,是一個用 Python 編寫的可以并發在多臺 服務器 上批量執行命令的工具,它支持文件并行復制、 遠程 并行執行命令、殺掉 遠程 上的 進程 等。其中,文件并行復制是pssh核心功能,也是同類工具中最大的亮點,因此,要批量在 遠程 主機 上傳、下載文件時,最好選用pssh這個 服務器 批量管理工具。
要使用pssh工具包,必須保證本地和要管理的之間的單向信任,也就是要在本地和所有上配置密鑰認證訪問。創建本地和之間的單向信任非常簡單,下面以創建本地用戶opsuser和所有上opsuser用戶之間的信任為例介紹配置的基本過程。
(1)在本地主機上創建RSA密鑰和公鑰
1)在本地 主機 上以opsuser用戶登錄。
2)在opsuser用戶的根目錄內創建.ssh目錄并設置讀取權限。
[opsuser@server ~]$ mkdir ~/.ssh
[opsuser@server ~]$ chmod 700 ~/.ssh
3)使用ssh-keygen命令生成基于SSH協議的RSA密鑰。
[opsuser@server ~]$ cd ~/.ssh
[opsuser@server ~]$ ssh-keygen -t rsa
在提示保存私鑰(key)和公鑰(public key)的位置時,選擇默認值,然后依次按回車鍵即可。
(2)整合公鑰文件
在本地 主機 上以opsuser用戶登錄,執行如下操作:
[opsuser@server ~]$ cd ~/.ssh
[opsuser@server ssh]$ cat /home/opsuser/.ssh/id_rsa.pub > authorized_keys
[opsuser@server ssh]$ chmod 600 ~/.ssh/authorized_keys
[opsuser@server ssh]$ scp authorized_keys user001:/home/opsuser/.ssh/
這個操作過程是將本地節點生成的公鑰文件整合為一個authorized_keys文件,然后進行授權,并將authorized_keys復制到所有上。這里以user001為例。
(3)測試SSH密鑰認證
在本地 主機 上執行如下命令:
[opsuser@server ssh]$ ssh user001 date
這里以user001為例,其他依此類推,如果不需要輸入就出現系統當前日期,說明SSH單向信任已經配置成功了。
2、pssh的安裝與用法
pssh要求 Python 版本大于2.4即可。這里下載的是pssh-2.3.1.tar.gz,安裝過程如下:
[root@server ~]# tar zxvf pssh-2.3.1.tar.gz
[root@server ~]# cd pssh-2.3.1
[root@server pssh-2.3.1]# python setup.py install
安裝完成的pssh工具包附帶了5個主程序,分別是:
parallel ssh(pssh),在多臺上并行運行命令。
parallel scp(pscp),把文件并行復制到多臺上,類似于scp命令。
parallel rsync(prsync),使用rsync協議將文件從本地同步到多臺上。
parallel nuke(pnuke),在多臺上并行killall某一。
parallel slurp(pslurp),把文件從多臺復制到本地,與pscp命令相反。
完成pssh安裝后,執行“pssh--help”命令即可顯示pssh命令的詳細用法,表1是pssh常用的參數以及語法介紹。
表1 pssh命令的常用參數以及含義
3、pssh應用實例
pssh命令的使用非常靈活,可以根據實際的應用需要選擇對應的命令工具,例如,要在 遠程 上批量執行一些信息統計命令,就可以通過pssh命令來完成。而要將一些文件傳輸到 遠程 的多臺 主機 上,或者將 遠程 主機 的某些文件復制到本地 主機 時,就需要使用pscp命令和pslurp命令了,如果要傳輸某些文件夾到 遠程 多臺 主機 上時,就必須選擇prsync命令了。
(1)pssh批量查看遠程主機信息
通過pssh命令查看user002和user003上面的時間信息,實現過程如圖1所示。
圖1 通過pssh命令查看user002和user003服務器上的時間信息
在這個操作中,通過“-H”參數指定的單臺,另外,通過這個操作可以很清楚地看到“-P”參數與“-i”參數的差別。
pssh命令更多的用途是批量管理,下面的例子演示的就是批量查看多臺的負載狀況,如圖2和圖3所示。
圖2 遠程服務器列表
圖3 通過pssh獲取的遠程服務器負載信息
這個操作中用到了“-O”參數,后面跟的“StrictHostKeyChecking=no”是sshd服務的配置文件ssh_config中的一個選項,通過設置這個參數,可以讓自動接受本地的hostkey,而不用每次都要手動輸入yes。后面還用到了“-h”參數,通過這個參數可以指定一個需要連接的列表,文件內容如圖2所示。在這個文件中省略了用戶名和連接端口,那么pssh將自動使用當前用戶opsuser和默認端口22。
從圖3的輸出結果看,獲取的負載信息不是按照列表的順序顯示的,這剛好說明pssh的并發執行特性。
pssh可調用tar命令解壓上的文件,例如:
[opsuser@server ~]$ pssh -i -h /etc/pssh/hosts "tar -zxvf hadoop-2.0.0-cdh4.5.0.tar.gz"
在這個例子中,pssh默認解壓的是上/home/opsuser/hadoop-2.0.0-cdh4.5.0.tar.gz文件,而要解壓root用戶下的文件,可以執行如下操作:
[opsuser@server ~]$ pssh -i -h /etc/pssh/hosts > "sudo "tar -zxvf /mnt/hadoop-2.0.0-cdh4.5.0.tar.gz -c /mnt" "
在這個例子中,pssh調用了“sudo”命令,因此,要操作具有root權限的文件時,opsuser用戶在上必須開通可通過sudo命令切換到root用戶的權限。
pssh也可批量刪除上指定的文件或目錄,例如:
[opsuser@server ~]$ pssh -i -h /etc/pssh/hosts > "sudo "rm -rf /mnt/hadoop-2.0.0-cdh4.5.0" "
類似的例子有很多,比如通過pssh還可以在上安裝軟件、啟動系統服務等,看下面兩個例子:
[opsuser@server ~]$ pssh -i -h /etc/pssh/hosts "sudo "yum -y install pssh" "
[opsuser@server ~]$ pssh -i -h /etc/pssh/hosts "sudo "/etc/init..d/gmond start" "
下面這個操作是pssh的綜合應用實例:
[opsuser@server ~]$ pssh -i -x "-l opsuser" "-p 9529" -h /etc/pssh/hosts > -o /etc/pssh/info "uptime;uname -a"
這個實例用到了“-x”參數,分別調用了ssh命令的兩個參數“-l”和“-p”,用于指定在上登錄的用戶名和端口,而“-o”參數指定將輸出結果存放到/etc/pssh/info目錄中。在此實例的最后指定了要在上執行的命令,可以指定多個命令,每個命令之間用分號隔開。
(2)pscp與pslurp應用實例
pscp命令的主要作用是將本地文件并行地復制到多臺上,而pslurp是把文件從 多臺復制到本地,這兩個命令的功能剛好相反。在工作中,需要進行文件批量傳送時,這兩個命令非常有用。
首先看pscp的兩個應用實例,如圖4所示。
圖4 pscp應用實例
圖4中第一個例子是將本地上的/etc/ssh/ssh_config文件復制到的/tmp目錄下,這是pscp最簡單的用法,如果要復制的文件比較多,一個一個執行就非常麻煩,此時可以通過復制目錄的方式實現。第二個例子就是將本地的/etc/httpd/conf目錄復制到的/tmp目錄下,在進行目錄復制時,用到了“-r”參數,表示遞歸地復制指定目錄下的所有文件。這里需要注意權限問題,指定上的目標路徑一定是當前用戶可讀寫的,否則會發生錯誤。
完成復制后,在上查看復制過來的目錄,結構如下:
[opsuser@user001 ~]$ ls -ld /tmp/conf drwxr -xr-x 2 opsuser opsuser 4096 Jan 5 16:06 /tmp/conf
接下來再看pslurp的兩個應用實例,如圖5所示。
圖5 pslurp應用實例
圖5中第一個例子是將所有上的/home/opsuser/gmond.conf文件復制到本地的/home/opsuser/test目錄下,并將文件改名為gmond1.conf,這里面用到了“-L”參數,用來指定本地路徑,這個路徑是個目錄,用于存儲從傳輸過來的文件。第二個例子是將所有上的/home/opsuser/gmond目錄復制到本地的/home/opsuser/test目錄下,并將復制過來的目錄改名為gmond1,這里面也用到了“-r”和“-L”參數,需要注意這兩個參數的順序不能顛倒。
完成數據復制后,在本地的/home/opsuser/test目錄下存放著所有以名命名的目錄,這里以user001為例,查看復制過來的文件,結果如圖6所示。
圖6 pslurp復制遠程文件結構圖
(3)prsync與pnuke應用實例
prsync的主要作用是通過rsync協議將文件或目錄從本地同步到多個上,先看prsync的兩個應用實例,如圖7所示。
圖7 prsync應用實例
圖7的第一個實例中使用了“-l”、“-a”和“-r”參數,其中“-l”用于指定上的用戶,“-r”用于遞歸復制指定目錄下的所有文件,“-a”參數可以維持文件的屬性值不變,例如文件的創建時間、修改時間、讀寫權限等,這個參數在做目錄復制時非常有用,建議使用。
第二個實例中又引入了“-z”參數,這是一個壓縮傳輸參數,在低帶寬環境下,或者在對網絡帶寬有要求、傳輸文件壓縮率比較大時使用。而在帶寬充足或傳輸的文件比較大時,不推薦使用。
pnuke的主要作用是在 遠程 多 主機 上并行殺掉某一 進程 ,相當于killall命令。 它的用法非常簡單,最簡單的用法如下:
[opsuser@server ~]$pnuke -h /etc/pssh/hosts httpd
這個命令將在所有上并行關閉httpd服務,pnuke的作用類似于killall,而后面跟的httpd是服務名,其實只要通過killall命令能關閉的服務,都可以通過pnuke來批量完成。