靈活使用ssh、dsh和pssh高效管理大量計算機
云在根本上是由硬件和軟件組成的,這些組件需要經常細心地維護。出現故障的硬件需要修理或更換;軟件需要應用補丁、更新和升級;必須根據需求和潛在的安全威脅提前配置系統。應用程序開發人員可能覺得計算云很方便、很靈活,但是云管理員要應對艱巨的任務。
不只是云的管理有這些問題。LAN(小型服務器群)和計算集群也有同樣的系統管理難題。在管理大量計算機時,Secure Shell (ssh)、scp
和 sftp
等常用工具用起來非常麻煩。本期 對話 UNIX 討論從命令行有效地管理大量計算機的技術,先從少量系統開始,然后擴大規模。
強力方式
在一組計算機上運行命令的簡單方法是,把共用的 ssh 命令包裝在腳本中。假設您已經把公共密鑰分發到希望訪問的每個遠程系統上(避免每次都需要輸入密碼),腳本 mssh.sh 在指定的每臺計算機上運行一個命令,最后輸出收集的結果(見 清單 1)。
清單 1. mssh.sh
#!/bin/bash # Usage: mssh.sh "machine1 [machine2...]" "command" OUTPUT_LOG=/tmp/output-$$.log ERROR_LOG=/tmp/error-$$.log MACHINES=$1; shift COMMAND=$2; shift for machine in $MACHINES do ssh $machine $COMMAND >>$OUTPUT_LOG.$machine 2>>$ERROR_LOG.$machine & done wait cat $OUTPUT_LOG.* cat $ERROR_LOG.* >&2 rm -f $OUTPUT_LOG.* $ERROR_LOG.* |
例如,命令 mssh.sh "example.com joe@sample.com" "uptime -a">
在兩臺主機(example.com 和 sample.com)上運行 uptime -a
。計算機名列表放在引號中以組成一個參數,由于同樣的原因,命令也放在引號中。每個計算機名必須符合 ssh 要求的模式 — 如果遠程用戶名與本地用戶名相同,那么使用 hostname
;如果遠程用戶名與本地用戶名不同,那么使用 username@hostname
。運行 mssh.sh "example.com joe@sample.com" "uptime -a">
會產生這樣的結果:
$ mssh.sh "example.com joe@sample.com" "uptime" example.com 08:34:35 up 66 days, 17:29, 0 users, load average: 0.40, 0.19, 0.07 joe@sample.com 08:34:28 up 104 days, 10:18, 0 users, load average: 0.15, 0.10, 0.10 |
這個腳本很原始,但是可以通過擴展它包含其他特性,比如用可調的超時設置防止在主機停機時出現長時間延遲(ssh -o
選項),用指定的目錄捕捉輸出。實際上,有許多按這種方式構建的軟件包,可以簡化分布式系統管理。其中之一是 Distributed Shell (dsh)。
更好的工具
dsh 是專為在遠程系統上運行 shell 命令設計的,可以簡化對大量計算機的操作。可以獲取這個 shell 的二進制代碼和源代碼。對于二進制代碼,檢查您的 Linux® 或 UNIX® 發行版是否有 libdshconfig
和 dsh
包。例如,Ubuntu 和 Debian 用戶可以通過 apt-get
方便地安裝 dsh:
$ sudo apt-get install libdshconfig1 libdshconfig1-dev dsh |
如果找不到針對您的系統預構建的包,從源代碼構建 dsh 也很容易。找到庫和實用程序的最新版本,下載并解壓兩個壓縮文件,用通常的 ./configure; make; sudo make install
命令構建和安裝它們(見 清單 2)。
清單 2. 從源代碼構建 dsh
$ # Build and install the library first $ wget http://www.netfort.gr.jp/~dancer/software/downloads/libdshconfig-0.20.13.tar.gz $ tar xzvf libdshconfig-0.20.13.tar.gz $ cd libshconfig-0.20.13 $ ./configure $ make $ sudo make install $ # Then build and install the utility $ wget http://www.netfort.gr.jp/~dancer/software/downloads/dsh-0.25.9.tar.gz $ tar xzvf dsh-0.25.9.tar.gz $ cd dsh-0.25.9 $ ./configure $ make $ sudo make install |
這個 shell 是相當小的應用程序;dsh
和 dsh.conf
手冊頁提供掌握它所需的所有信息。例如,要想在一組主機上運行 uptime
,只需輸入:
$ dsh --show-machine-names -m example.com -m joe@sample.com -- uptime example.com: 11:34:57 up 66 days, 20:29, 0 users, load average: 0.04, 0.06, 0.01 joe@sample.com: 11:35 up 2 days, 14:59, 8 users, load averages: 0.46 0.35 0.31 |
用 -m
指定主機,主機名的規則與 ssh 相同。命令行中的雙連字符把 dsh
命令本身的選項與要運行的命令分隔開。按指定主機的次序顯示輸出。--show-machine-names
選項在遠程命令發出的輸出前面加上主機名。
如果經常操作同一組計算機,可以定義一個或多個集合并指定要操作的集合。可以創建一個全局集合和任意數量的組。$HOME/.dsh/machines.list 文件是全局集合。如果指定 dsh -a
,就會在 machines.list 中列出的所有計算機上運行指定的命令。因此,如果 machines.list 包含:
example.com joe@sample.com |
那么命令:
dsh -a --show-machine-names -- uptime |
會產生與前一個命令相同的輸出:
$ dsh -a --show-machine-names -- uptime example.com: 11:57:03 up 66 days, 20:51, 0 users, load average: 0.29, 0.18, 0.07 joe@sample.com: 11:57 up 2 days, 15:21, 8 users, load averages: 0.52 0.31 0.26 |
可以在 $HOME/.dsh/group/groupname 文件中創建更小或專門的計算機集合,其中的 groupname 是您指定的有意義的名稱。例如,如果創建名為 $HOME/.dsh/group/servers 的文件,那么命令 dsh -g servers -- uptime
會在 servers 文件中列出的所有計算機上運行 uptime
。
可以結合使用 -m
與 -a
和 -g
,分別擴展全局列表和組。另外,可以使用 --file filename
把 filename
中列出的所有計算機添加到主機列表中。在默認情況下,dsh 并行地運行命令。但是,如果希望順序地運行命令,那么指定 --wait-shell
。
盡管很方便,但是 dsh 有一個重大的缺陷:它無法復制文件。如果希望把數據部署到多臺計算機上,就必須編寫一個新腳本,利用發行版的基礎設施(比如 rsync
),或者考慮使用更健壯的工具(比如 Parallel SSH (pssh))。
與 ssh 相似,但采用并行方式
與 dsh 一樣,pssh 的目標也是簡化大量計算機的管理。除了具備 dsh 的所有功能之外,pssh 還可以把文件從一組系統復制到中心服務器或反向復制,以及殺死一組系統上的進程。這個 shell 和它的底層庫是用 Python 編寫的,如果系統上已經安裝了 Python 解釋器和核心庫,就很容易安裝它(見 清單 3)。
清單 3. 安裝 pssh
$ # For systems with apt-get (apt-get installs Python if necessary) $ sudo apt-get install pssh $ # For all others, install Python and then continue $ wget http://peak.telecommunity.com/dist/ez_setup.py $ sudo python ez_setup.py $ wget http://parallel-ssh.googlecode.com/files/pssh-2.1.1.tar.gz $ tar xzvf pssh-2.1.1.tar.gz $ cd pssh-2.1.1 $ sudo python setup.py install |
pssh 包安裝 5 個實用程序:parallel-ssh
、parallel-scp
、parallel-slurp
、parallel-nuke
和 parallel-rsync
。每個實用程序都并行地操作多個主機。
parallel-ssh
在多個主機上并行地運行命令。parallel-scp
把文件并行地復制到多個主機上。parallel-rsync
通過rsync
協議把文件高效地并行復制到多個主機上。parallel-slurp
把文件并行地從多個遠程主機復制到中心主機上。parallel-nuke
并行地在多個遠程主機上殺死進程。
與 dsh 不同,pssh 總是通過清單 文件指定主機,其中的每行采用 host[:port] [user]
形式。下面的示例用 parallel-ssh
在一組主機上運行 uptime
:
$ parallel-ssh -h servers.txt uptime [1] 16:15:14 [SUCCESS] example.com 22 16:15 up 2 days, 19:39, 9 users, load averages: 0.09 0.10 0.12 [2] 16:15:28 [SUCCESS] sample.com 22 16:15:28 up 67 days, 1:09, 0 users, load average: 0.09, 0.07, 0.01 |
servers.txt 文件有兩行:
example.com sample.com joe |
在默認情況下,每個命令實例的輸出出現在 stdout 中。輸出劃分為每個主機一段。但是,可以指定一個目錄來捕捉每個實例的輸出。例如,如果運行前面的命令并添加 --outdir /tmp/uptime
,那么會把每個主機的命令輸出捕捉到 /tmp/uptime 中單獨的文件中,見 清單 4。
清單 4. 把輸出捕捉到單獨的文件中
$ parallel-ssh -h servers.txt uptime [1] 16:15:14 [SUCCESS] example.com 22 [2] 16:15:28 [SUCCESS] sample.com 22 $ ls -1 /tmp/uptime example.com sample.com $ cat /tmp/uptime/* 16:22 up 2 days, 19:46, 9 users, load averages: 0.47 0.28 0.19 16:22:32 up 67 days, 1:17, 0 users, load average: 0.06, 0.04, 0.00 |
parallel-ssh
實用程序可以生成最多 32 個進程,并行地連接各個節點。如果遠程命令在 60 秒內沒有完成,連接會終止。如果命令需要更多處理時間,可以使用 -t
設置更長的到期時間。(parallel-scp
和 parallel-rsync
沒有默認的到期時間,但是可以用 -t
指定到期時間。)
可以使用 parallel-scp
并行地把一個或多個文件或目錄復制到許多計算機。如果您精通傳統的 scp
,應該熟悉這個命令。
$ parallel-scp -h servers.txt /etc/hosts /tmp/hosts [1] 16:49:38 [SUCCESS] example.com 22 [2] 16:49:55 [SUCCESS] sample.com 22 |
前面的命令把本地文件 /etc/hosts 復制到 servers.txt 中列出的每臺計算機上的 /tmp/hosts。parallel-rsync
的工作方式相似,它通過運行 rsync
并行地在本地主機和清單中列出的遠程主機之間管理文件。parallel-slurp
的作用與 parallel-scp
相反,但是有一點不同:它從每臺遠程計算機收集指定的文件,但是并不覆蓋文件的本地版本。parallel-slurp
為每臺遠程計算機創建一個子目錄并把指定的文件復制到此位置。
假設希望把 /etc/hosts 文件從每臺遠程計算機復制到本地計算機。為實現這個目標,執行 parallel-slurp -h servers.txt /etc/hosts
,見 清單 5。
清單 5. 把 /etc/hosts 文件從遠程計算機復制到本地計算機
$ parallel-slurp -h servers.txt -L /tmp/hosts /etc/hosts hosts_file 1] 17:03:32 [SUCCESS] example.com 22 [2] 17:03:50 [SUCCESS] dcauto.gotdns.com 22 $ ls -R /tmp/hosts /tmp/hosts/example.com: hosts_file /tmp/hosts/sample.com: hosts_file |
parallel-slurp
把指定的遠程文件復制到本地計算機,把文件的每個拷貝存儲在按遠程主機命名的子目錄中。在這里,遠程文件是 /etc/hosts;每個本地拷貝名為 hosts_file。-L
選項指定創建子目錄的位置。在這里,目標是 /tmp/hosts,這會生成子目錄 /tmp/hosts/example.com 和 /tmp/hosts/sample.com。
最后,parallel-nuke
相當于運行 ssh host killall
。parallel-nuke
的參數是一個模式。在遠程計算機上運行的名稱符合這個模式的所有進程都被殺死。可以用此命令方便地在一組服務器上停止同一守護進程。
要想使用 pssh 工具,必須在要管理的每臺遠程服務器上配置公共密鑰訪問。如果 pssh 實用程序產生 [FAILURE]
,就用一般的 ssh 建立連接以檢查配置。如果系統提示輸入密碼,那么在遠程主機上安裝公共密鑰并再次嘗試連接。(具體步驟見 ssh
和 ssh-keygen
手冊頁。)
操作大量計算機的其他工具
對于 5 臺、10 臺或更多計算機,這里介紹的工具很可能足夠了,尤其是對于不經常執行的非重復性管理任務。但是,如果計算機數量很大,或者經常重復執行相同的任務,那么應該謹慎地考慮采用為自動維護大量計算機而設計的其他工具和子系統。另一方面,為大型網絡設計的一些軟件也可以應用于少量計算機。找到適當的工具以及手工干預與自動化之間的平衡點是一個難題,而且需要經常重新審查和調整。
下面是可以考慮采用的一些工具:
rsync
:這個出色的工具用于從中心服務器分發文件以及保持分布式文件系統同步。前面的一期對話 UNIX 詳細討論了rsync
。- Puppet。Puppet 是一個越來越流行的 UNIX 和 Linux 子系統,它可以自動地維護配置。根據它的網站所說,“[Puppet] 提供一個強大的框架,可以簡化 [系統管理員] 需要執行的大多數技術任務。可以用 Puppet 的定制語言編寫各種任務,可以像其他代碼一樣共享這些任務代碼。” Puppet 可以描述組件之間的依賴關系、定義文件的正確狀態、查詢系統的狀態等等。如果要多次執行某一任務,最好以 Puppet 任務的形式捕捉它。
- Capistrano。Capistrano 是另一個流行的遠程系統管理工具。它的主頁上說:“簡單地說,Capistrano 用于在一個或多個遠程服務器上自動地執行任務。它在所有目標計算機上并行地執行命令,還提供在多臺計算機上回退修改的機制。它非常適合任何人執行任何系統管理任務,包括專業的系統管理員和偶爾執行系統管理的人員。” 與 Puppet 相同,Capistrano 采用腳本編程。腳本基于 Ruby 編程語言和 Capistrano 的域相關語言。下面是一個示例:
task :search_libs, :hosts => "www.capify.org" do run "ls -x1 /usr/lib | grep -i xml" end
此任務名為
search_libs
。它連接 www.capify.org 并運行命令ls -x1 /usr/lib | grep -i xml
。Capistrano 通過角色 支持計算機組,還提供許多其他特性。通過cap
命令啟動任務,比如cap search_libs
。Ruby 和 Rails 開發人員廣泛采用 Capistrano 把代碼部署到服務器,但是對于自動執行大多數分布式系統管理任務,它也是非常好的工具。一些教程解釋了如何結合使用 Capistrano 與 Java™ 語言、Perl、Python 和其他編程語言,以及如何結合使用 Capistrano 與 Drupal and Expression Engine 等應用程序引擎。如果與源代碼控制系統結合使用,Capistrano 的效果最好,但這不是必需的。可以通過put
操作分發二進制代碼。 - Nagios。維護很重要,但是監視也很重要。停機和錯誤會在網絡上造成嚴重破壞,尤其是在許多系統采用相同配置的情況下。Nagios 是一個開放源碼監視程序,它可以監視服務器、服務、資源等。它的安裝和部署很容易,可以通過任何 web 瀏覽器使用它。
還可以研究 Oak Ridge National Laboratory (ORNL) 的 Cluster Command and Control (C3) 和 pdsh 等計算集群工具。C3 操作 ORNL 的大規模計算集群,它提供大量命令行工具,可以減少操作和管理集群所需的時間和精力,提高系統管理員的生產力。pdsh shell 在許多方面與 pssh 相似,但是還可以管理系統映像。
用很少的時間管理大量計算機
使用 dsh 和 pssh 等工具能夠節省時間并減少錯誤。可以在大量系統上運行相同的命令,幾乎馬上會看到組合的結果。通過清單把相似的計算機集中在一起可以降低遺漏的風險。Puppet 和 Capistrano 可以把經常重復執行的任務捕捉到腳本中。如果管理的計算機比較多,自動化就是關鍵。總之,如果采用適當的工具,計算云的管理也不難。
原文:http://www.ibm.com/developerworks/cn/aix/library/au-spunix_remoteserver/index.html?ca=drs-
【編輯推薦】