RunDeck 是用 Java/Grails 寫的開源工具,幫助用戶在數據中心或者雲環境中自動化各種操作和流程。通過命令行或者web界面,用戶可以對任意數量的服務器進行操作,大大降低了對服務器自動化的門檻。
RunDeck的作用:
-
在瀏覽器中執行服務器上任何非交互命令,比如ps, /etc/init.d/xxx restart,注意ssh之類的要在執行中輸入密碼的肯定不支持
-
對接服務器上的一鍵運維腳本,變成一個Job, 執行時只要點擊按鈕Run
-
自動記錄命令操作記錄和輸出。
預覽一下官網的幾張圖片:
Share Standard Operating Procedures
Automated Deployment After a Build
Self-Service Test Environments
Data Processing Jobs in the Cloud
注意: 上面的幾張部署圖中的rundeck方塊,如果替換成“命令行運維腳本”,照樣能完成各自的目的,但是命令行相比RunDeck,缺少了兩樣Rundeck特有的特性:
- 在瀏覽器上按鈕操作
- 記錄命令的執行記錄和輸出結果
Rundeck與自動化工具Fabric的對比
Fabric 是一個 Python (2.5 或更高) 庫和命令行工具,用於連接到 SSH 服務器並執行命令。
Rundeck服務運行的結點稱為Server,Rundeck還可以添加其他結點叫node,只要設置自動登錄所需的ssh帳號和密碼,Rundeck就能涵蓋Fabric的功能,但是不推薦這樣使用,一旦Rundeck服務器無效,就連在命令行完成這些運維也不可能了。
建議的使用方式是:所有運維腳本都存放在Rundeck服務器上,提供命令行調用和RunDeck調用兩種方式,為命令行調用提供交互輸入帳號和密碼的功能,為Rundeck調用提供參數輸入帳號和密碼的功能。
Rundeck的安全問題
在瀏覽器中打開Rundeck服務器,並登錄后,執行命令的帳號和權限,就是啟動Rundeck服務的帳號和權限。
所以如果以root啟動Rundeck服務,那么在Rundeck中輸入任何命令,都是以root執行,包括rm -rf /,init 0等危險操作都可執行。
建議專門建立rundeck帳號啟動Rundeck服務,並控制rundeck帳號的權限。
RunDeck Web界面的登錄帳號管理,默認管理員帳號是admin,密碼admin,帳號和密碼信息,只保存在配置文件中,可用的group是admin和user,可以設置user的權限,比如定義job,執行job等。更高級的權限得使用付費版的RunDeck Pro。
RunDeck服務器的資源消耗
RunDeck服務是一個standalone jar包,占用內存約500M。
RunDeck服務器上已定義Job的執行方式
-
Web界面上點擊Run人工執行
-
通過RunDeck的命令行工具run執行
-
RunDeck中設置為周期執行,就像cron一樣。
-
通過Rest API,由其他http client執行,比如curl命令。
上面第2種方式,用命令行工具run執行RunDeck job,好像有點多此一舉,但正是此方式特別適用於手工或自動的服務器狀態巡查。巡查必須要留下記錄,不然只是巡查者的一面之辭。
RunDeck服務器上Job的執行如何判斷成功或失敗
很簡單,執行后,如果rc是0,就是成功,否則就是失敗。
rc(Return Code),可以這樣查看rc:
shen@debian:~$ ls / 2>1 >/dev/null; echo $? 0 shen@debian:~$ ls /asdfsdf 2>1 >/dev/null; echo $? 2
RunDeck安裝與使用實例
RunDeck,是我到現在為止,用過的Web服務器中,安裝和使用最簡單的。
第1步:在准備安裝Rundeck服務的Linux機器上安裝jre,推薦OpenJDK
Redhat/CentOS
sudo yum install openjdk-7-jre
Debian/Ubuntu
sudo apt-get install openjdk-7-jre
下面是安裝后的版本信息:
shen@debian:~$ java -version java version "1.7.0_79" OpenJDK Runtime Environment (IcedTea 2.5.5) (7u79-2.5.5-1~deb7u1) OpenJDK 64-Bit Server VM (build 24.79-b02, mixed mode)
第2步:下載rundeck jar包,並啟動服務器
http://rundeck.org/downloads.html
下載 rundeck-launcher-2.5.1.jar,官方說明如下:
Put it in a directory named ~/rundeck Execute: java -jar rundeck-launcher-2.5.1.jar
下載有點慢(晚上下載速度5KB/s,早上7點893KB/s),我已下載並放在百度雲盤上: http://pan.baidu.com/s/1i3EMcNb。
我放在目錄/home/shen/rundeck下運行:
cd /home/shen/rundeck java -jar rundeck-launcher-2.5.1.jar
最行一行輸出的:Started表示已啟動完成,:4440表示服務的端口為4440
瀏覽器中輸入網址: http://localhost:4440
第3步:創建一個Project,比如adhoc,先體驗一下在Web輸入和執行命令。
因為只在Rundeck服務器上運行本地命令,所以Resource Model Source刪除yml文件,Default Node Executor選擇Stub,Default Node File Copier也選擇Stub。
執行本地命令 pwd,應該輸出:/home/shen/rundeck
點擊Run on 1 Node:
pwd命令的輸出:/home/shen/rundeck正是rundeck服務啟動位置。
上面兩條命令返回狀態都是綠色Successed,表示執行成功(rc=0),
接下去嘗試一個返回失敗的命令ls /asdfsdf
第3條命令返回狀態都是紅色Failed,表示執行失敗(rc!=0),上圖中輸出的第1行是運行stderr輸出,第2,3,4行是Rundeck額外輸出,提示出錯原因:**Return code was 2**
接下去看看已經執行的3條命令的執行記錄和輸出,這里體現了Rundeck的最重要的特性。直接在Terminal下執行命令,是不可能事后找回命令輸出的。
點擊網頁第一行右上角的Activity:
上圖展示了3條已執行命令的執行編號,命令輸入、執行時間、執行者,成功或失敗狀態。
點擊標簽頁(Summary | Report | Log Output | Definition)中的Log Output,可以看到執行的輸出,包括stdout和stderr:
更改命令為ls /asdfsdf /,並點擊Run on 1 Node:
上圖中只顯示了輸出結果的最后20行,點擊#4進去看執行詳情:
上圖中列出了執行的所有stdout與stderr輸出。
第4步:創建另一個Project,比如jobs(喬布斯, ),體驗job的定義和一鍵執行。
點擊“Create a new job”,或者點擊右上角的Create Job > +New Job…
在Add a Step中點擊Execute an inline script
如上圖,Enter the entire script to execute中輸入ls /abcd1234 /
點擊Save,保存Step定義,一個Job中可以有多個Step,我們的第一個Job是最簡單的定義,只有一個步驟,該步驟中直接包含1個命令。
點擊Create完成Job定義:
點擊Run Job Now:
查看Log Output:
點擊Project jobs的鏈接“1 Execution In the last day”:
可以看到此Project的最近Job或Command的執行歷史。
點擊網頁第一行的Jobs可以看到該Project的Job列表:
下面在添加一個Job: how,探索一下Rundeck是怎么執行Job的。
Step定義為如下腳本:
echo '`pwd` ->' pwd echo '$0 ->' echo $0 echo '`ps` ->' ps
Job執行結果:
Job執行時,創建了一個/tmp/下的臨時腳本文件:
/tmp/1-6-debian-dispatch-script.tmp.sh
ps列出的是ps進程及它的祖先進程,其他java就是rundeck服務。
參考資料:
http://www.oschina.net/p/rundeck/similar_projects?sort=view&lang=25