雲在根本上是由硬件和軟件組成的,這些組件須要常常細心地維護。出現故障的硬件須要修理或更換;軟件須要應用補丁、更新和升級;必須根據需求和潛在的安全威脅提早配置系統。應用程序開發人員可能以爲計算雲很方便、很靈活,可是雲管理員要應對艱鉅的任務。
不僅是雲的管理有這些問題。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 ... nfig-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 ... s/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 能夠把常常重複執行的任務捕捉到腳本中。若是管理的計算機比較多,自動化就是關鍵。總之,若是採用適當的工具,計算雲的管理也不難。python