靈活使用ssh、dsh和pssh高效管理大量計(jì)算機(jī)
云在根本上是由硬件和軟件組成的,這些組件需要經(jīng)常細(xì)心地維護(hù)。出現(xiàn)故障的硬件需要修理或更換;軟件需要應(yīng)用補(bǔ)丁、更新和升級;必須根據(jù)需求和潛在的安全威脅提前配置系統(tǒng)。應(yīng)用程序開發(fā)人員可能覺得計(jì)算云很方便、很靈活,但是云管理員要應(yīng)對艱巨的任務(wù)。
不只是云的管理有這些問題。LAN(小型服務(wù)器群)和計(jì)算集群也有同樣的系統(tǒng)管理難題。在管理大量計(jì)算機(jī)時(shí),Secure Shell (ssh)、scp
和 sftp
等常用工具用起來非常麻煩。本期 對話 UNIX 討論從命令行有效地管理大量計(jì)算機(jī)的技術(shù),先從少量系統(tǒng)開始,然后擴(kuò)大規(guī)模。
強(qiáng)力方式
在一組計(jì)算機(jī)上運(yùn)行命令的簡單方法是,把共用的 ssh 命令包裝在腳本中。假設(shè)您已經(jīng)把公共密鑰分發(fā)到希望訪問的每個遠(yuǎn)程系統(tǒng)上(避免每次都需要輸入密碼),腳本 mssh.sh 在指定的每臺計(jì)算機(jī)上運(yùn)行一個命令,最后輸出收集的結(jié)果(見 清單 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">
在兩臺主機(jī)(example.com 和 sample.com)上運(yùn)行 uptime -a
。計(jì)算機(jī)名列表放在引號中以組成一個參數(shù),由于同樣的原因,命令也放在引號中。每個計(jì)算機(jī)名必須符合 ssh 要求的模式 — 如果遠(yuǎn)程用戶名與本地用戶名相同,那么使用 hostname
;如果遠(yuǎn)程用戶名與本地用戶名不同,那么使用 username@hostname
。運(yùn)行 mssh.sh "example.com joe@sample.com" "uptime -a">
會產(chǎn)生這樣的結(jié)果:
$ 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 |
這個腳本很原始,但是可以通過擴(kuò)展它包含其他特性,比如用可調(diào)的超時(shí)設(shè)置防止在主機(jī)停機(jī)時(shí)出現(xiàn)長時(shí)間延遲(ssh -o
選項(xiàng)),用指定的目錄捕捉輸出。實(shí)際上,有許多按這種方式構(gòu)建的軟件包,可以簡化分布式系統(tǒng)管理。其中之一是 Distributed Shell (dsh)。
更好的工具
dsh 是專為在遠(yuǎn)程系統(tǒng)上運(yùn)行 shell 命令設(shè)計(jì)的,可以簡化對大量計(jì)算機(jī)的操作??梢垣@取這個 shell 的二進(jìn)制代碼和源代碼。對于二進(jìn)制代碼,檢查您的 Linux® 或 UNIX® 發(fā)行版是否有 libdshconfig
和 dsh
包。例如,Ubuntu 和 Debian 用戶可以通過 apt-get
方便地安裝 dsh:
$ sudo apt-get install libdshconfig1 libdshconfig1-dev dsh |
如果找不到針對您的系統(tǒng)預(yù)構(gòu)建的包,從源代碼構(gòu)建 dsh 也很容易。找到庫和實(shí)用程序的最新版本,下載并解壓兩個壓縮文件,用通常的 ./configure; make; sudo make install
命令構(gòu)建和安裝它們(見 清單 2)。
清單 2. 從源代碼構(gòu)建 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 是相當(dāng)小的應(yīng)用程序;dsh
和 dsh.conf
手冊頁提供掌握它所需的所有信息。例如,要想在一組主機(jī)上運(yùn)行 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
指定主機(jī),主機(jī)名的規(guī)則與 ssh 相同。命令行中的雙連字符把 dsh
命令本身的選項(xiàng)與要運(yùn)行的命令分隔開。按指定主機(jī)的次序顯示輸出。--show-machine-names
選項(xiàng)在遠(yuǎn)程命令發(fā)出的輸出前面加上主機(jī)名。
如果經(jīng)常操作同一組計(jì)算機(jī),可以定義一個或多個集合并指定要操作的集合??梢詣?chuàng)建一個全局集合和任意數(shù)量的組。$HOME/.dsh/machines.list 文件是全局集合。如果指定 dsh -a
,就會在 machines.list 中列出的所有計(jì)算機(jī)上運(yùn)行指定的命令。因此,如果 machines.list 包含:
example.com joe@sample.com |
那么命令:
dsh -a --show-machine-names -- uptime |
會產(chǎn)生與前一個命令相同的輸出:
$ 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 文件中創(chuàng)建更小或?qū)iT的計(jì)算機(jī)集合,其中的 groupname 是您指定的有意義的名稱。例如,如果創(chuàng)建名為 $HOME/.dsh/group/servers 的文件,那么命令 dsh -g servers -- uptime
會在 servers 文件中列出的所有計(jì)算機(jī)上運(yùn)行 uptime
。
可以結(jié)合使用 -m
與 -a
和 -g
,分別擴(kuò)展全局列表和組。另外,可以使用 --file filename
把 filename
中列出的所有計(jì)算機(jī)添加到主機(jī)列表中。在默認(rèn)情況下,dsh 并行地運(yùn)行命令。但是,如果希望順序地運(yùn)行命令,那么指定 --wait-shell
。
盡管很方便,但是 dsh 有一個重大的缺陷:它無法復(fù)制文件。如果希望把數(shù)據(jù)部署到多臺計(jì)算機(jī)上,就必須編寫一個新腳本,利用發(fā)行版的基礎(chǔ)設(shè)施(比如 rsync
),或者考慮使用更健壯的工具(比如 Parallel SSH (pssh))。
與 ssh 相似,但采用并行方式
與 dsh 一樣,pssh 的目標(biāo)也是簡化大量計(jì)算機(jī)的管理。除了具備 dsh 的所有功能之外,pssh 還可以把文件從一組系統(tǒng)復(fù)制到中心服務(wù)器或反向復(fù)制,以及殺死一組系統(tǒng)上的進(jìn)程。這個 shell 和它的底層庫是用 Python 編寫的,如果系統(tǒng)上已經(jīng)安裝了 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 個實(shí)用程序:parallel-ssh
、parallel-scp
、parallel-slurp
、parallel-nuke
和 parallel-rsync
。每個實(shí)用程序都并行地操作多個主機(jī)。
parallel-ssh
在多個主機(jī)上并行地運(yùn)行命令。parallel-scp
把文件并行地復(fù)制到多個主機(jī)上。parallel-rsync
通過rsync
協(xié)議把文件高效地并行復(fù)制到多個主機(jī)上。parallel-slurp
把文件并行地從多個遠(yuǎn)程主機(jī)復(fù)制到中心主機(jī)上。parallel-nuke
并行地在多個遠(yuǎn)程主機(jī)上殺死進(jìn)程。
與 dsh 不同,pssh 總是通過清單 文件指定主機(jī),其中的每行采用 host[:port] [user]
形式。下面的示例用 parallel-ssh
在一組主機(jī)上運(yùn)行 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 |
在默認(rèn)情況下,每個命令實(shí)例的輸出出現(xiàn)在 stdout 中。輸出劃分為每個主機(jī)一段。但是,可以指定一個目錄來捕捉每個實(shí)例的輸出。例如,如果運(yùn)行前面的命令并添加 --outdir /tmp/uptime
,那么會把每個主機(jī)的命令輸出捕捉到 /tmp/uptime 中單獨(dú)的文件中,見 清單 4。
清單 4. 把輸出捕捉到單獨(dú)的文件中
$ 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
實(shí)用程序可以生成最多 32 個進(jìn)程,并行地連接各個節(jié)點(diǎn)。如果遠(yuǎn)程命令在 60 秒內(nèi)沒有完成,連接會終止。如果命令需要更多處理時(shí)間,可以使用 -t
設(shè)置更長的到期時(shí)間。(parallel-scp
和 parallel-rsync
沒有默認(rèn)的到期時(shí)間,但是可以用 -t
指定到期時(shí)間。)
可以使用 parallel-scp
并行地把一個或多個文件或目錄復(fù)制到許多計(jì)算機(jī)。如果您精通傳統(tǒng)的 scp
,應(yīng)該熟悉這個命令。
$ 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 復(fù)制到 servers.txt 中列出的每臺計(jì)算機(jī)上的 /tmp/hosts。parallel-rsync
的工作方式相似,它通過運(yùn)行 rsync
并行地在本地主機(jī)和清單中列出的遠(yuǎn)程主機(jī)之間管理文件。parallel-slurp
的作用與 parallel-scp
相反,但是有一點(diǎn)不同:它從每臺遠(yuǎn)程計(jì)算機(jī)收集指定的文件,但是并不覆蓋文件的本地版本。parallel-slurp
為每臺遠(yuǎn)程計(jì)算機(jī)創(chuàng)建一個子目錄并把指定的文件復(fù)制到此位置。
假設(shè)希望把 /etc/hosts 文件從每臺遠(yuǎn)程計(jì)算機(jī)復(fù)制到本地計(jì)算機(jī)。為實(shí)現(xiàn)這個目標(biāo),執(zhí)行 parallel-slurp -h servers.txt /etc/hosts
,見 清單 5。
清單 5. 把 /etc/hosts 文件從遠(yuǎn)程計(jì)算機(jī)復(fù)制到本地計(jì)算機(jī)
$ 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
把指定的遠(yuǎn)程文件復(fù)制到本地計(jì)算機(jī),把文件的每個拷貝存儲在按遠(yuǎn)程主機(jī)命名的子目錄中。在這里,遠(yuǎn)程文件是 /etc/hosts;每個本地拷貝名為 hosts_file。-L
選項(xiàng)指定創(chuàng)建子目錄的位置。在這里,目標(biāo)是 /tmp/hosts,這會生成子目錄 /tmp/hosts/example.com 和 /tmp/hosts/sample.com。
最后,parallel-nuke
相當(dāng)于運(yùn)行 ssh host killall
。parallel-nuke
的參數(shù)是一個模式。在遠(yuǎn)程計(jì)算機(jī)上運(yùn)行的名稱符合這個模式的所有進(jìn)程都被殺死??梢杂么嗣罘奖愕卦谝唤M服務(wù)器上停止同一守護(hù)進(jìn)程。
要想使用 pssh 工具,必須在要管理的每臺遠(yuǎn)程服務(wù)器上配置公共密鑰訪問。如果 pssh 實(shí)用程序產(chǎn)生 [FAILURE]
,就用一般的 ssh 建立連接以檢查配置。如果系統(tǒng)提示輸入密碼,那么在遠(yuǎn)程主機(jī)上安裝公共密鑰并再次嘗試連接。(具體步驟見 ssh
和 ssh-keygen
手冊頁。)
操作大量計(jì)算機(jī)的其他工具
對于 5 臺、10 臺或更多計(jì)算機(jī),這里介紹的工具很可能足夠了,尤其是對于不經(jīng)常執(zhí)行的非重復(fù)性管理任務(wù)。但是,如果計(jì)算機(jī)數(shù)量很大,或者經(jīng)常重復(fù)執(zhí)行相同的任務(wù),那么應(yīng)該謹(jǐn)慎地考慮采用為自動維護(hù)大量計(jì)算機(jī)而設(shè)計(jì)的其他工具和子系統(tǒng)。另一方面,為大型網(wǎng)絡(luò)設(shè)計(jì)的一些軟件也可以應(yīng)用于少量計(jì)算機(jī)。找到適當(dāng)?shù)墓ぞ咭约笆止じ深A(yù)與自動化之間的平衡點(diǎn)是一個難題,而且需要經(jīng)常重新審查和調(diào)整。
下面是可以考慮采用的一些工具:
rsync
:這個出色的工具用于從中心服務(wù)器分發(fā)文件以及保持分布式文件系統(tǒng)同步。前面的一期對話 UNIX 詳細(xì)討論了rsync
。- Puppet。Puppet 是一個越來越流行的 UNIX 和 Linux 子系統(tǒng),它可以自動地維護(hù)配置。根據(jù)它的網(wǎng)站所說,“[Puppet] 提供一個強(qiáng)大的框架,可以簡化 [系統(tǒng)管理員] 需要執(zhí)行的大多數(shù)技術(shù)任務(wù)。可以用 Puppet 的定制語言編寫各種任務(wù),可以像其他代碼一樣共享這些任務(wù)代碼。” Puppet 可以描述組件之間的依賴關(guān)系、定義文件的正確狀態(tài)、查詢系統(tǒng)的狀態(tài)等等。如果要多次執(zhí)行某一任務(wù),最好以 Puppet 任務(wù)的形式捕捉它。
- Capistrano。Capistrano 是另一個流行的遠(yuǎn)程系統(tǒng)管理工具。它的主頁上說:“簡單地說,Capistrano 用于在一個或多個遠(yuǎn)程服務(wù)器上自動地執(zhí)行任務(wù)。它在所有目標(biāo)計(jì)算機(jī)上并行地執(zhí)行命令,還提供在多臺計(jì)算機(jī)上回退修改的機(jī)制。它非常適合任何人執(zhí)行任何系統(tǒng)管理任務(wù),包括專業(yè)的系統(tǒng)管理員和偶爾執(zhí)行系統(tǒng)管理的人員。” 與 Puppet 相同,Capistrano 采用腳本編程。腳本基于 Ruby 編程語言和 Capistrano 的域相關(guān)語言。下面是一個示例:
task :search_libs, :hosts => "www.capify.org" do run "ls -x1 /usr/lib | grep -i xml" end
此任務(wù)名為
search_libs
。它連接 www.capify.org 并運(yùn)行命令ls -x1 /usr/lib | grep -i xml
。Capistrano 通過角色 支持計(jì)算機(jī)組,還提供許多其他特性。通過cap
命令啟動任務(wù),比如cap search_libs
。Ruby 和 Rails 開發(fā)人員廣泛采用 Capistrano 把代碼部署到服務(wù)器,但是對于自動執(zhí)行大多數(shù)分布式系統(tǒng)管理任務(wù),它也是非常好的工具。一些教程解釋了如何結(jié)合使用 Capistrano 與 Java™ 語言、Perl、Python 和其他編程語言,以及如何結(jié)合使用 Capistrano 與 Drupal and Expression Engine 等應(yīng)用程序引擎。如果與源代碼控制系統(tǒng)結(jié)合使用,Capistrano 的效果最好,但這不是必需的。可以通過put
操作分發(fā)二進(jìn)制代碼。 - Nagios。維護(hù)很重要,但是監(jiān)視也很重要。停機(jī)和錯誤會在網(wǎng)絡(luò)上造成嚴(yán)重破壞,尤其是在許多系統(tǒng)采用相同配置的情況下。Nagios 是一個開放源碼監(jiān)視程序,它可以監(jiān)視服務(wù)器、服務(wù)、資源等。它的安裝和部署很容易,可以通過任何 web 瀏覽器使用它。
還可以研究 Oak Ridge National Laboratory (ORNL) 的 Cluster Command and Control (C3) 和 pdsh 等計(jì)算集群工具。C3 操作 ORNL 的大規(guī)模計(jì)算集群,它提供大量命令行工具,可以減少操作和管理集群所需的時(shí)間和精力,提高系統(tǒng)管理員的生產(chǎn)力。pdsh shell 在許多方面與 pssh 相似,但是還可以管理系統(tǒng)映像。
用很少的時(shí)間管理大量計(jì)算機(jī)
使用 dsh 和 pssh 等工具能夠節(jié)省時(shí)間并減少錯誤??梢栽诖罅肯到y(tǒng)上運(yùn)行相同的命令,幾乎馬上會看到組合的結(jié)果。通過清單把相似的計(jì)算機(jī)集中在一起可以降低遺漏的風(fēng)險(xiǎn)。Puppet 和 Capistrano 可以把經(jīng)常重復(fù)執(zhí)行的任務(wù)捕捉到腳本中。如果管理的計(jì)算機(jī)比較多,自動化就是關(guān)鍵。總之,如果采用適當(dāng)?shù)墓ぞ?,?jì)算云的管理也不難。
原文:http://www.ibm.com/developerworks/cn/aix/library/au-spunix_remoteserver/index.html?ca=drs-
【編輯推薦】