服務器多了,原始操作就會出現弊端,假如同時給成百上千臺服務器執行一個命令,拷貝一個文件,殺一個進程等,就需要逐個連接服務器進行操作,累死運維小哥。有什麼簡化運維管理的工具呢?
可以編寫shell腳本使用for循環,但是這樣做一方面不確定操作是否成功,另一方面for循環語句性能不好,因爲命令是同步執行的。那有什麼效率高,且使用方便的工具呢?這類工具已經有很多了,比如 pdsh,mussh,cssh,dsh等還有這裏提到的pssh:
pssh是一個python編寫可以在多臺服務器上執行命令的工具,同時支持拷貝文件,是同類工具中很出色的,類似pdsh,個人認爲相對pdsh更爲簡便。
安裝pssh
pssh安裝還是非常簡單的,前提需要Python環境的支持。
#下載安裝包
wget http://parallel-ssh.googlecode.com/files/pssh-2.3.1.tar.gz
#解壓
tar -zxvf pssh-2.3.1.tar.gz
cd pssh-2.3.1
#安裝
python setup.py install
介紹pssh命令,參數
參數:
-h 執行命令的遠程主機列表 或者 -H user@ip:port 文件內容格式[user@]host[:port]
-l 遠程機器的用戶名
-P 執行時輸出執行信息
-p 一次最大允許多少連接
-o 輸出內容重定向到一個文件
-e 執行錯誤重定向到一個文件
-t 設置命令執行的超時時間
-A 提示輸入密碼並且把密碼傳遞給ssh
-O 設置ssh參數的具體配置,參照ssh_config配置文件
-x 傳遞多個SSH 命令,多個命令用空格分開,用引號括起來
-X 同-x 但是一次只能傳遞一個命令
-i 顯示標準輸出和標準錯誤在每臺host執行完畢後
命令:
pscp 傳輸文件到多個hosts,類似scp
pslurp 從多臺遠程機器拷貝文件到本地
pnuke 並行在遠程主機殺進程
prsync 使用rsync協議從本地計算機同步到遠程主機
遠程控制服務器
遠程控制服務器有兩種模式:登錄模式和命令模式
登錄模式:將會登錄到遠程服務器的終端
命令模式:只會遠程執行命令,返回結果,不會登錄。
如下所示:
[root@test pssh]# pssh -H [email protected] -A -P date
Warning: do not enter your password if anyone else has superuser
privileges or access to your account.
Password:
192.168.22.211: 2016年 03月 23日 星期三 14:56:24 CST
[1] 14:56:25 [SUCCESS] root@192.168.22.211
-A:提示輸入密碼,-P:返回執行結果
建立安全連接
操作的時候每次都要輸入密碼,服務器數量多的話操作很麻煩,所以要用到ssh安全連接,將本地加密的安全密鑰文件,拷貝到遠程服務器上。建立一個單向信任的連接,放到 .ssh文件夾中,下面測試將在22.210服務器上進行。
ssh-keygen 創建公鑰和密鑰,使用數字簽名RSA
[root@test pssh]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
55:6c:23:2a:2b:9b:21:b7:6f:73:02:b7:49:7c:fb:43 [email protected]
The key's randomart image is:
+--[ RSA 2048]----+
| .. |
| ..+ |
| ..o . |
| . .. |
| . oS |
| . = = . E |
| o X + o |
| + * o . |
| o.+ ... |
+-----------------+
查看是否創建
[root@test pssh]# cd /root/.ssh/
[root@test .ssh]# ls
id_rsa id_rsa.pub known_hosts
將公鑰複製到遠程主機上
[root@test .ssh]# ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
root@192.168.22.211's password:
Now try logging into the machine, with "ssh '[email protected]'", and check in:
.ssh/authorized_keys
to make sure we haven't added extra keys that you weren't expecting.
在次連接遠程主機時,不用輸入密碼
[root@test .ssh]# ssh [email protected]
Last failed login: Wed Mar 23 14:49:56 CST 2016 from 192.168.22.210 on ssh:notty
There was 1 failed login attempt since the last successful login.
Last login: Wed Mar 23 14:47:37 2016 from 192.168.22.210
[root@adminjc ~]#
PSSH小試
編寫Host文件
[root@test .ssh]# vim HostList
插入內容:格式爲:用戶名+@+主機ip+:端口號,端口號默認爲22,可不寫。其他端口號要寫明
root@192.168.22.211
root@192.168.22.212
root@192.168.22.213
root@192.168.22.214
以上寫的就是要遠程控制的主機列表
PSSH批量執行命令,並行命令的執行。
pssh -h HostList -P "command"
""裏面可以輸入命令串
例如:
在從節點建立新目錄/home/slave/test
pssh -h HostList -P "mkdir /home/slave/test"
執行日誌命令,返回各服務器時間
[root@test .ssh]# pssh -h HostList -P date
192.168.22.212: 2016年 03月 23日 星期三 16:30:43 CST
[1] 16:30:43 [SUCCESS] root@192.168.22.212
192.168.22.211: 2016年 03月 23日 星期三 16:30:43 CST
192.168.22.214: 2016年 03月 23日 星期三 16:30:44 CST
[2] 16:30:43 [SUCCESS] root@192.168.22.211
[3] 16:30:43 [SUCCESS] root@192.168.22.214
192.168.22.213: 2016年 03月 23日 星期三 16:30:44 CST
[4] 16:30:44 [SUCCESS] root@192.168.22.213
[root@test .ssh]#
-p選項指定同時執行的線程數
[root@test .ssh]# pssh -h HostList -p 2 -P date
pscp命令,批量複製文件到遠程主機
pscp是遠程拷貝文件,如從主節點將文件分發到所有從節點
[root@test .ssh]# vim psshtest
[root@test .ssh]# pscp -h HostList -r psshtest /usr/local/
[1] 16:40:26 [SUCCESS] root@192.168.22.211
[2] 16:40:26 [SUCCESS] root@192.168.22.213
[3] 16:40:26 [SUCCESS] root@192.168.22.214
[4] 16:40:26 [SUCCESS] root@192.168.22.212
[root@test .ssh]#
小結
pssh就介紹到這,集羣管理工具有很多,比如後面要說的SaltStack,puppet,func等功能一個比一個強大。
環境加速成長,當只有一臺服務器時,手工操作其實也沒事,完全應付的過來;但是當服務器數量多了以後,就必要要考慮,怎麼才能提高效率,減少錯誤。選擇合適的工具能夠有立竿見影的效果。