雲在根本上是由硬件和軟件組成的,這些組件需要經常細心地維護。出現故障的硬件需要修理或更換;軟件需要應用補丁、更新和升級;必須根據需求和潛在的安全威脅提前配置系統。應用程序開發人員可能覺得計算雲很方便、很靈活,但是雲管理員要應對艱巨的任務。
不只是雲的管理有這些問題。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 [email protected]" "uptime -a">
在兩台主機(example.com 和 sample.com)上運行 uptime -a
。計算機名列表放在引號中以組成一個參數,由於同樣的原因,命令也放在引號中。每個計算機名必須符合 ssh 要求的模式 — 如果遠程用戶名與本地用戶名相同,那麼使用 hostname
;如果遠程用戶名與本地用戶名不同,那麼使用 username@hostname
。運行 mssh.sh "example.com [email protected]" "uptime -a">
會產生這樣的結果:
$ mssh.sh "example.com [email protected]" "uptime" example.com 08:34:35 up 66 days, 17:29, 0 users, load average: 0.40, 0.19, 0.07 [email protected] 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 [email protected] -- uptime example.com: 11:34:57 up 66 days, 20:29, 0 users, load average: 0.04, 0.06, 0.01 [email protected]: 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 [email protected]
那麼命令:
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 [email protected]: 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
。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
操作分發二進制代碼。
還可以研究 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-