RunDeckを使ってみる

今回はRunDeckというツールを試してみる事にしました。

RunDeckとは?


RunDeckとは
「データセンターやクラウド環境において、決まった手順を自動化する助けとなるソフトウェア」ということです。


ジョブ管理ツールですね。


今回はまずインストールして簡単に触るところまで。

インストールする


インストールはyumを使えば簡単です。

# rpm -Uvh http://rundeck.org/latest.rpm
http://rundeck.org/latest.rpm を取得中
準備中...                ########################################### [100%]
   1:rundeck-repo           ########################################### [100%]
# yum install rundeck
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * extras: ftp.iij.ad.jp
 * updates: ftp.iij.ad.jp
rundeck-release                                          |  951 B     00:00     
rundeck-release/primary                                  | 1.8 kB     00:00     
rundeck-release                                                             8/8
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package rundeck.noarch 0:1.3.0-2.48 set to be updated
--> Processing Dependency: java-1.6.0-openjdk for package: rundeck
--> Processing Dependency: rundeck-config for package: rundeck
--> Running transaction check
---> Package java-1.6.0-openjdk.x86_64 1:1.6.0.0-1.22.1.9.8.el5_6 set to be updated
--> Processing Dependency: jpackage-utils >= 1.7.3-1jpp.2 for package: java-1.6.0-openjdk
--> Processing Dependency: libasound.so.2(ALSA_0.9)(64bit) for package: java-1.6.0-openjdk
--> Processing Dependency: libasound.so.2(ALSA_0.9.0rc4)(64bit) for package: java-1.6.0-openjdk
--> Processing Dependency: tzdata-java for package: java-1.6.0-openjdk
--> Processing Dependency: libXtst.so.6()(64bit) for package: java-1.6.0-openjdk
--> Processing Dependency: libasound.so.2()(64bit) for package: java-1.6.0-openjdk
--> Processing Dependency: libgif.so.4()(64bit) for package: java-1.6.0-openjdk
---> Package rundeck-config.noarch 0:1.3.0-2.48 set to be updated
--> Running transaction check
---> Package alsa-lib.x86_64 0:1.0.17-1.el5 set to be updated
---> Package giflib.x86_64 0:4.1.3-7.3.3.el5 set to be updated
---> Package jpackage-utils.noarch 0:1.7.3-1jpp.2.el5 set to be updated
---> Package libXtst.x86_64 0:1.0.1-3.1 set to be updated
---> Package tzdata-java.x86_64 0:2011g-1.el5 set to be updated
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
 Package             Arch    Version                     Repository        Size
================================================================================
Installing:
 rundeck             noarch  1.3.0-2.48                  rundeck-release   45 M
Installing for dependencies:
 alsa-lib            x86_64  1.0.17-1.el5                base             414 k
 giflib              x86_64  4.1.3-7.3.3.el5             updates           39 k
 java-1.6.0-openjdk  x86_64  1:1.6.0.0-1.22.1.9.8.el5_6  updates           37 M
 jpackage-utils      noarch  1.7.3-1jpp.2.el5            base              61 k
 libXtst             x86_64  1.0.1-3.1                   base              16 k
 rundeck-config      noarch  1.3.0-2.48                  rundeck-release  7.9 k
 tzdata-java         x86_64  2011g-1.el5                 updates          180 k

Transaction Summary
================================================================================
Install       8 Package(s)
Upgrade       0 Package(s)

Total download size: 82 M
Is this ok [y/N]: y


リポジトリの設定ファイルはこんな感じでした。

# cat /etc/yum.repos.d/rundeck.repo 
[rundeck-release]
name=Rundeck - Release
baseurl=http://rundeck.org/repo/rundeck/1/release
gpgkey=http://rundeck.org/repo/RPM-GPG-KEY-RunDeck.org
gpgcheck=0

[rundeck-updates]
name=Rundeck - Updates
baseurl=http://rundeck.org/repo/rundeck/1/updates
gpgkey=http://rundeck.org/repo/RPM-GPG-KEY-RunDeck.org
gpgcheck=0
enabled=0

[rundeck-bleeding]
name=Rundeck - Bleeding Edge
baseurl=http://rundeck.org/repo/rundeck/1/bleedingedge
gpgcheck=0
enabled=0

ユーザー登録


ユーザーを登録します。設定ファイルは「/etc/rundeck/realm.properties」です。


ユーザー名:パスワード(クリアテキスト)の形で設定します。

# The format is
#  <username>: <password>[,<rolename> ...]


パスワードはMD5形式で指定することが出来ました。


例えば、「admin」というパスワードを設定したければ、以下のように計算します。

# echo "admin" | md5sum
456b7016a916a4b178dd72b947c152b7  -


MD5を使ってハッシュ化したパスワードの設定例は以下の通りです。

admin: MD5:456b7016a916a4b178dd72b947c152b7,server-administrator,content-administrator,admin


LDAP, ActiveDirectoryと連携したユーザー管理も可能なようです。どこかで試してみようと思います。

起動してみる


今回はRPMパッケージでインストールしたので、普通に起動スクリプトをキックすればOK。

# /etc/init.d/rundeckd start
rundeckd を起動中:                                         [  OK  ]


その後、Webブラウザから「http://xxx.xxx.xxx.xxx:4440」へアクセスします。
以下の画面が表示されれば、起動しています。



設定したユーザーでログインすると以下の画面が表示されます。


試す


まずは自分自身に対してコマンドを発行してみました。コマンドを発行した結果が表示されています。


簡単なジョブを作ってみる


複数サーバーに対してリモートログインして、決められたコマンドを順番に発行するというのを試します。


今回検証用に3ノード用意しました。詳細は以下の通りです。

  • rundeck-test1(リモート操作用ノード#1)
  • rundeck-test2(リモート操作用ノード#2)
  • rundeck-test3(Rundeckを動かすノード)


sshログインはrundeckユーザー経由で実行されます。
rundeck-test3上で、パスフレーズ無しの公開鍵/秘密鍵のペアを作成します。


その後公開鍵はそれぞれ、rundeck-test1、rundeck-test2に配布しました。

$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/rundeck/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/rundeck/.ssh/id_rsa.
Your public key has been saved in /home/rundeck/.ssh/id_rsa.pub.
The key fingerprint is:
ac:bf:2f:53:b7:b4:6d:40:b0:21:7e:1d:ee:86:85:07 rundeck@rundeck-test3


「rundeck-test1」「rundeck-test2」にSSHログイン後、Apache/MySQLを再起動できるようにするために、以下の設定を行います。

# visudo

(1)以下の行をコメントアウト
#Defaults    requiretty

(2)以下の行を追加
rundeck ALL=(root) NOPASSWD:/etc/init.d/httpd, /etc/init.d/mysqld


管理画面ログイン後、上部メニュー「Jobs」→右メニューの「New Jobs...」をクリックし、
ジョブを登録します。



具体的に登録したジョブは以下の通りです。

■rundeck-test1に対してApache/MySQLの停止・起動
(1) [rundeck@rundeck-test1] $sudo /etc/init.d/httpd stop
(2) [rundeck@rundeck-test1] $sudo /etc/init.d/mysqld stop
(3) [rundeck@rundeck-test1] $sudo /etc/init.d/mysqld start
(4) [rundeck@rundeck-test1] $sudo /etc/init.d/httpd start

■rundeck-test2に対して、Apache/MySQLの停止・起動
(5) [rundeck@rundeck-test2] $sudo /etc/init.d/httpd stop
(6) [rundeck@rundeck-test2] $sudo /etc/init.d/mysqld stop
(7) [rundeck@rundeck-test2] $sudo /etc/init.d/mysqld start
(8) [rundeck@rundeck-test2] $sudo /etc/init.d/httpd start


実行すると、無事指定した順番に停止→起動のオペレーションを行う事が出来ました。

■rundeck-test1に対してApache/MySQLの停止・起動
(1) dispatch -p test -I hostname="xxx.xxx.xxx.5" -- sudo /etc/init.d/httpd stop
[Thu Sep 15 01:50:18 2011] [notice] caught SIGTERM, shutting down

(2) dispatch -p test -I hostname="xxx.xxx.xxx.5" -- sudo /etc/init.d/mysqld stop
110915  1:50:20 [Note] /usr/libexec/mysqld: Normal shutdown

110915  1:50:20  InnoDB: Starting shutdown...
110915  1:50:21  InnoDB: Shutdown completed; log sequence number 0 43655
110915  1:50:21 [Note] /usr/libexec/mysqld: Shutdown complete

110915 01:50:21  mysqld ended

(3) dispatch -p test -I hostname="xxx.xxx.xxx.5" -- sudo /etc/init.d/mysqld start
110915 01:50:23  mysqld started
110915  1:50:23  InnoDB: Started; log sequence number 0 43655
110915  1:50:23 [Note] /usr/libexec/mysqld: ready for connections.
Version: '5.0.77'  socket: '/var/lib/mysql/mysql.sock'  port: 3306  Source distribution

(4) dispatch -p test -I hostname="xxx.xxx.xxx.5" -- sudo /etc/init.d/httpd start
[Thu Sep 15 01:50:24 2011] [notice] SELinux policy enabled; httpd running as context user_u:system_r:httpd_t:s0
[Thu Sep 15 01:50:24 2011] [notice] suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
[Thu Sep 15 01:50:24 2011] [notice] Digest: generating secret for digest authentication ...
[Thu Sep 15 01:50:24 2011] [notice] Digest: done
[Thu Sep 15 01:50:24 2011] [notice] Apache/2.2.3 (CentOS) configured -- resuming normal operations

■rundeck-test2に対して、Apache/MySQLの停止・起動
(5) dispatch -p test -I hostname="xxx.xxx.xxx.6" -- sudo /etc/init.d/httpd stop
[Thu Sep 15 01:50:29 2011] [notice] caught SIGTERM, shutting down

(6) dispatch -p test -I hostname="xxx.xxx.xxx.6" -- sudo /etc/init.d/mysqld stop
110915  1:50:32 [Note] /usr/libexec/mysqld: Normal shutdown

110915  1:50:32  InnoDB: Starting shutdown...
110915  1:50:32  InnoDB: Shutdown completed; log sequence number 0 43655
110915  1:50:32 [Note] /usr/libexec/mysqld: Shutdown complete

110915 01:50:32  mysqld ended

(7) dispatch -p test -I hostname="xxx.xxx.xxx.6" -- sudo /etc/init.d/mysqld start
110915 01:50:35  mysqld started
110915  1:50:36  InnoDB: Started; log sequence number 0 43655
110915  1:50:36 [Note] /usr/libexec/mysqld: ready for connections.
Version: '5.0.77'  socket: '/var/lib/mysql/mysql.sock'  port: 3306  Source distribution

(8) dispatch -p test -I hostname="xxx.xxx.xxx.6" -- sudo /etc/init.d/httpd start
[Thu Sep 15 01:50:37 2011] [notice] SELinux policy enabled; httpd running as context user_u:system_r:httpd_t:s0
[Thu Sep 15 01:50:37 2011] [notice] suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
[Thu Sep 15 01:50:37 2011] [notice] Digest: generating secret for digest authentication ...
[Thu Sep 15 01:50:37 2011] [notice] Digest: done
[Thu Sep 15 01:50:38 2011] [notice] Apache/2.2.3 (CentOS) configured -- resuming normal operations


Web画面上に、コマンドの実行状況も表示されていました。中々いい感じです。


今回は簡単なケースを想定してジョブを作ってみましたが、
工夫すれば色々オペレーションの自動化が出来そうな予感。


ただ、今回の方式ですとセキュリティ面の考慮は課題が残りました。
(パスワード認証無しのsudoを使っていること)


また試してみようと思います。


今日はこんな所で。