運維利器pssh、pdsh和mussh的使用技巧
今天週末,加上下雨天。沒打算出門,翻了幾頁書,怕日後容易忘記,做個筆記,總結一下批量運維工具的一些使用方法以及異同之處。
其中給出pssh的5個程序的使用方法圖解:
區別:
pssh有5個程序
pssh:執行命令 pscp:上傳文件 pslurp:下載文件到本機
prsync:將本地文件同步到遠程主機 pnuke殺死遠程主機的某個進程(如httpd)
pdsh有兩個方法:
pdsh:執行命令,類似pssh,但增加了命令交互模式以及正則表達式,更靈活。
pdcp:上傳文件到遠程主機,與pscp類似,但管理主機和遠程主機都要安裝pdsh包。
mussh:
mussh:批量執行遠程管理命令,主要是比pssh,pdsh增加了一個可執行腳本的功能。(shell,Perl,Python腳本) 指定的參數作用跟pssh 有很大區別。
原理:基於ssh祕鑰認證建立信任,在本管理主機上運行pssh、pdsh和mussh工具命令將shell命令發送至管理遠程主機(單主機或主機羣),相當於登陸到遠程主機上執行了同樣的shell命令。
由於條件限制,只有兩臺虛擬機,一臺用於模擬管理,一臺用於模擬遠程主機。
管理主機IP:192.168.1.106 (master1)
遠程主機IP:192.168.1.108 (master2)
一、在本地主機上創建RSA密鑰和公鑰。
以本地普通用戶soul用戶登陸爲例。
本管理主機以及所有遠程主機的普通賬戶密碼均設置爲soul,123456(測試環境)
1、在管理主機上建立密鑰過程:
[soul@master1 root]$ mkdir ~/.ssh
[soul@master1 root]$ chmod 700 ~/.ssh
[soul@master1 root]$ cd ~/.ssh
[soul@master1 .ssh]$ ssh-keygen -t rsa //全部默認,一路回車。
#將本生成的公鑰文件整合爲 authorized_keys,進行授權後複製到遠程主機的同目錄下.ssh/,需要在遠程主機soul用戶根目錄下建立目錄#mkdir ~/.ssh #chmod 700 ~/.ssh
[soul@master1 .ssh]$ cat /home/soul/.ssh/id_rsa.pub > authorized_keys
[soul@master1 .ssh]$ chmod 600 ~/.ssh/authorized_keys
[soul@master1 .ssh]$ scp authorized_keys [email protected]:/home/soul/.ssh/
2、測試ssh祕鑰認證。
[soul@master1 .ssh]$ ssh 192.168.1.108 uptime
14:40:17 up 4:47, 3 users, load average: 1.60, 1.73, 1.78
測試成功,已經建立信任。
有朋友可能會有疑問:直接用ssh就可以進行遠程管理了啊,爲毛還要pssh、pdsh和mussh工具?因爲ssh只能單臺執行命令,不能批量同時管理遠程主機。pssh、pdsh和mussh是一款爲了可以批量管理遠程主機而開發的工具。
A: pssh的安裝與用法:
有5個主程序:
pssh:在遠程多臺主機上並行運行命令。就是執行shell命令
pscp:將本地主機上的文件並行複製到遠程多臺主機上。就是上傳文件到遠程主機上
pslurp:將遠程多臺主機上的文件複製到本地主機上。就是下載文件到本地管理主機。與pscp相反
prsync:使用rsync協議將管理主機本地文件同步到遠程多臺主機上。
pnuke:在多臺遠程主機上並行killall某一服務進程。
參數介紹:
具體常用介紹:
-h HOST_FILE 後邊跟遠程主機列表(ip)
-H HOST_STRING 後邊跟遠程主機名或者ip地址
-l USER 指定遠程主機的用戶名
-p PAR 指定pssh最大的並行線程數。
-o 將輸出的內容重定向到一個指定的文件中
-O 指定ssh參數的具體配置
-e 將執行錯誤重定向到一個指定的文件中
-t 設定命令執行超時時間
-x 傳遞ssh命令的一些參數
-i 在遠程主機上執行命令完成後顯示標準輸出和標準錯誤
-P 在執行遠程命令時,輸出執行結果
下載安裝pssh-2.3.1
#wget http://files.opstool.com/files/pssh-2.3.1.tar.gz
# tar zxvf pssh-2.3.1.tar.gz
# cd pssh-2.3.1
# python setup.py build
# python setup.py install
1、批量查看遠程主機信息
單臺主機
[soul@localhost root]$pssh -H [email protected] -P date
192.168.1.108: 2017年 06月 08日 星期四 16:39:03 CST
[1] 15:26:01 [SUCCESS] [email protected]
[soul@localhost root]$ pssh -H [email protected]:2202 -P uptime //當遠程主機端口不爲默認22
192.168.1.108: 16:39:12 up 6:46, 2 users, load average: 1.49, 1.94, 1.96
[1] 15:26:10 [SUCCESS] [email protected]
-H 爲指定某一臺主機/IP -P爲打印出返回的結果內容 date爲要執行的shell命令
2、批量文件列表:
建立文件/etc/pssh/hosts 並授權權限chmod給soul用戶
#cat /etc/pssh/hosts
192.168.1.108
14.152.49.51:2202
[soul@localhost pssh]$ pssh -i -O "StrictHostKeyChecking=no" -h /etc/pssh/hosts "uptime"
[1] 15:41:23 [SUCCESS] 14.152.49.51:2202
15:48:22 up 43 days, 6:40, 2 users, load average: 0.00, 0.02, 0.00
[2] 15:41:23 [SUCCESS] 192.168.1.108
16:54:25 up 7:01, 2 users, load average: 1.55, 2.10, 2.06
-i爲標準輸出,跟-P直接打印有區別。-O 大寫 爲指定ssh參數的具體配置“StrictHostKeyChecking=no”參數可以讓遠程主機自動接受本地主機的key,不用每次都手動輸入yes確認。 -h指定文件主機列表
3、遠程執行解壓文件安裝包
#pssh -i -H [email protected] "tar -zxvf /usr/local/src/pssh-2.3.1.tar.gz"
文件必須放在soul根目錄並有執行權限,假如在root目錄下需要sudo
#pssh -i -H [email protected] "sudo "tar -zxvf /usr/local/src/pssh-2.3.1.tar.gz" "
報錯:Stderr: sudo: sorry, you must have a tty to run sudo
解決:vi /etc/sudoers 註釋掉 Default requiretty 一行 #Default requiretty
好像還是解決不了
4、pscp 將本地文件傳到遠程主機
[soul@localhost root]$pscp -H [email protected] /etc/ssh/ssh_config /tmp
[soul@localhost root]$pscp -H [email protected] -r /etc/ssh/ /tmp
-r 指拷貝文件目錄
5、pslurp 將遠程主機文件下載到本機
[soul@localhost root]$pslurp -H [email protected] -L /tmp/ /tmp/ssh_config ssh_config
[1] 16:26:47 [SUCCESS] [email protected]
-L 指定存放到本地哪個路徑下 下載遠程主機的/tmp/ssh_config文件到本地名爲ssh_config
但下載後的結果會自動以IP或者主機名創建一個目錄 以便分清是從哪臺主機上下載下來的。如果是下載文件目錄 需要在-L 前面加-r參數
6、prsync:使用rsync協議將管理主機本地文件同步到遠程多臺主機上。
[soul@localhost root]$ /usr/local/python27/bin/prsync -h /etc/pssh/hosts -l soul -a -r /etc/httpd /tmp/
[1] 16:32:55 [SUCCESS] 192.168.1.108
遠程主機上查看
[root@master2 tmp]# ll
總計 8
drwxr-xr-x 3 soul soul 4096 01-02 11:37 httpd
-l 指定遠程用戶 -a 指定文件的屬性不變,-r 文件目錄迭代
7、在多臺遠程主機上並行killall某一服務進程。
/usr/local/python27/bin/pnuke -H [email protected] mysqld
[1] 16:45:45 [SUCCESS] [email protected]
B: pdsh的安裝與用法:
http://code.google.com/p/pdsh/
[root@server ~]# tar jxvf pdsh-2.29.tar.bz2
[root@server ~]# cd pdsh-2.29
[root@server pdsh-2.29]#./configure --with-ssh --with-rsh --with-mrsh --with-mqshell --with-qshell --with-dshgroups --with-machines=/etc/pdsh/machines
[root@server pdsh-2.29]# make
[root@server pdsh-2.29]# make install
在執行configure階段,“--with-ssh”參數表示啓用ssh模塊,其他參數都有類似的含義,而“--with-dshgroups”表示啓用主機組支持,啓用此參數後,就可以將一組主機列表寫入一個文件並放到~/.dsh/group或/etc/dsh/group目錄下,然後通過pdsh的“-g”參數進行調用。最後的參數“--with-machines”是“--with-dshgroups”參數的擴展,通過將所有要管理的主機列表都寫入指定的/etc/pdsh/machines文件中,接着通過pdsh的“-a”參數調用,最終完成所有主機的便捷管理。
1、pdsh:批量執行命令。類似pssh 但多了交互命令模式以及正則表達式功能
2、pdcp:批量將本地文件/目錄複製上傳到遠程主機上。類似pscp 但pdcp需要在管理主機跟遠程主機同時安裝pdcp。所以文件上傳推薦使用pscp就行了
pdsh語法介紹:
-w host,host
指定遠程主機,可以指定多個,每個主機用逗號隔開,host可以是主機名也可以是IP地址。
#pdsh -w ssh:user001,ssh:user002,ssh:user003 "date"
此命令用來查看user001、user002、user003主機上的時間,其中ssh表示在遠程主機上執行命令的形式,默認是rsh。
正則表達式
#pdsh -w ssh:user00[1-10] "date"
此命令用於在user001到user0010上執行date命令。
pdsh -w ssh:user0[10-31],/1$/ "uptime"
此命令在選擇遠程主機時使用了正則表達式,表示在user010到user031中選擇以1結尾的主機名,即在user011、user021、user031上執行uptime命令
-R
指定使用rcmd的模塊名,默認是rsh。如果要選擇ssh,可以通過如下方式指定:
pdsh -R ssh -w user00[1-10] "date"
-l
指定在遠程主機上使用的用戶名稱。例如:
pdsh -R ssh -l opsuser -w user00[1-9] "date"
-x
此參數用來排除某些或某個主機,例如:
pdsh -R ssh -l opsuser -w user00[1-9] -x user005,user007 "date"
-t 指定連接遠程主機的超時時間,以秒爲單位,默認是10秒,可以通過此參數修改默認值,例如:pdsh -R ssh -w slave000[1-9] -t 15 "date"
-u設置遠程命令執行的超時時間,以秒爲單位,以ssh方式連接時,默認時間爲無限
-f 設置同時連接到遠程主機的個數
-N 此參數用來關閉遠程主機所返回結果中的主機名顯示
-a 通過此參數可以指定所有的遠程主機,設置此參數後,pdsh默認會查看/etc/machines文件中的主機列表,要改變此路徑,在編譯pdsh時通過“--with-machines”參數指定即可
-g 此參數用來指定一組遠程主機,在編譯pdsh時可以通過“--with-dshgroups”參數來激活此選項,默認可以將一組主機列表寫入一個文件中並放到本地主機的~/.dsh/group或/etc/dsh/group目錄下,這樣就可以通過“-g”參數調用了。例如:pdsh -R ssh -g userhosts "date",其中“userhosts”是一個主機列表文件,可以將此文件放在~/.dsh/group或/etc/dsh/group目錄下
-X 此參數用來排除指定組內的所有主機,經常與“-a”參數一起使用。例如:
pdsh -R ssh -a -X userhosts "date"
C:做主機ssh封裝器mussh
mussh 主要是增加了腳本執行的功能。
mussh的突出功能是可以在多臺遠程主機上執行本地的腳本,包括shell,Perl,Python腳本。
下載https://mussh.sourceforge.net/
解壓即可使用
tar -zxvf mussh-1.0.tgz
#cd mussh-1.0
參數:
d [n] Shell調試模式,n取值:0-2
-v [n] SSH調試模式,n取值:0-3
-m [n] 併發進程數,如果設置爲0,則表示沒限制
-q 安靜模式
-i [identity ..] 加載密鑰文件
-o 設置ssh參數
-b 將每個主機的輸出打印到一個塊中,不和其它主機輸出混合
-B 允許所有主機輸出混合在一起,默認值
-u 去除重複的主機名,默認值
-U 不管指定的主機名是否重複
-P 如果密鑰認證失敗,不不提示輸入密碼登錄
-l 在遠程主機上執行命令的用戶
-s 指定在遠程主機上執行腳本的shell路徑,例如:mussh -s /usr/bin/python -C mysql_check.py
-t 在遠程主機上執行命令的超時時間
-h 指定某一臺主機,或同時多臺,用逗號分隔。
-H 指定某一個文件列表。
-c 指定執行某一個或多個shell命令,用逗號隔開。
-C 指定執行某一個腳本文件。
[soul@localhost mussh]$mussh -H /etc/mussh/hosts -l soul -c uptime
[soul@localhost mussh]$mussh -o "port=2202" -H /etc/mussh/hosts -s "/usr/bin/python /home/mysqlback.py"
pssh、pdsh和mussh三個工具的使用區別介紹到這裏。