【自動部署】服務器自動化操作 RunDeck


RunDeck 是用 Java/Grails 寫的開源工具,幫助用戶在數據中心或者雲環境中自動化各種操作和流程。通過命令行或者web界面,用戶可以對任意數量的服務器進行操作,大大降低了對服務器自動化的門檻。

RunDeck的作用:

  1. 在瀏覽器中執行服務器上任何非交互命令,比如ps, /etc/init.d/xxx restart,注意ssh之類的要在執行中輸入密碼的肯定不支持

  2. 對接服務器上的一鍵運維腳本,變成一個Job, 執行時只要點擊按鈕Run

  3. 自動記錄命令操作記錄和輸出。

 

預覽一下官網的幾張圖片:

Share Standard Operating Procedures
輸入圖片說明

Job Scheduler
輸入圖片說明

Automated Deployment After a Build
輸入圖片說明

Self-Service Test Environments
輸入圖片說明

Data Processing Jobs in the Cloud
輸入圖片說明

注意: 上面的幾張部署圖中的rundeck方塊,如果替換成“命令行運維腳本”,照樣能完成各自的目的,但是命令行相比RunDeck,缺少了兩樣Rundeck特有的特性:
- 在瀏覽器上按鈕操作
- 記錄命令的執行記錄和輸出結果

再看看Rundeck執行Job時的屏幕截圖:
輸入圖片說明

 

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的執行方式

  1. Web界面上點擊Run人工執行

  2. 通過RunDeck的命令行工具run執行

  3. RunDeck中設置為周期執行,就像cron一樣。

  4. 通過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
輸入圖片說明

輸入帳號admin,密碼admin,登錄:
輸入圖片說明

 

第3步:創建一個Project,比如adhoc,先體驗一下在Web輸入和執行命令。

輸入圖片說明

輸入圖片說明
因為只在Rundeck服務器上運行本地命令,所以Resource Model Source刪除yml文件,Default Node Executor選擇Stub,Default Node File Copier也選擇Stub。

輸入圖片說明

進入頂上Tab: Commands
輸入圖片說明

執行本地命令 pwd,應該輸出:/home/shen/rundeck
輸入圖片說明
輸入圖片說明
輸入圖片說明
輸入圖片說明
點擊Run on 1 Node:
輸入圖片說明
pwd命令的輸出:/home/shen/rundeck正是rundeck服務啟動位置。

執行 whoami,應該輸出:shen
輸入圖片說明

上面兩條命令返回狀態都是綠色Successed,表示執行成功(rc=0),
接下去嘗試一個返回失敗的命令ls /asdfsdf

輸入圖片說明
第3條命令返回狀態都是紅色Failed,表示執行失敗(rc!=0),上圖中輸出的第1行是運行stderr輸出,第2,3,4行是Rundeck額外輸出,提示出錯原因:**Return code was 2**

接下去看看已經執行的3條命令的執行記錄和輸出,這里體現了Rundeck的最重要的特性。直接在Terminal下執行命令,是不可能事后找回命令輸出的。

點擊網頁第一行右上角的Activity:
輸入圖片說明
上圖展示了3條已執行命令的執行編號,命令輸入、執行時間、執行者,成功或失敗狀態。

點擊#3,進去查看第3條命令的執行詳情:
輸入圖片說明

點擊標簽頁(Summary | Report | Log Output | Definition)中的Log Output,可以看到執行的輸出,包括stdout和stderr:
輸入圖片說明

點擊View Options,可以設置某些選項:
輸入圖片說明

下面點擊網頁右上角的Run Again:
輸入圖片說明

更改命令為ls /asdfsdf /,並點擊Run on 1 Node:
輸入圖片說明
上圖中只顯示了輸出結果的最后20行,點擊#4進去看執行詳情:
輸入圖片說明
上圖中列出了執行的所有stdout與stderr輸出。

第4步:創建另一個Project,比如jobs(喬布斯, ),體驗job的定義和一鍵執行。

輸入圖片說明

點擊“Create a new job”,或者點擊右上角的Create Job > +New Job…
輸入圖片說明

按下圖輸入Job Name和Description
輸入圖片說明

輸入圖片說明
在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:
輸入圖片說明

點擊網頁左上角的RUNDECK,回到首頁:
輸入圖片說明

點擊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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM