Rundeck インストール編

以前書いた Rundeck のメモです。死蔵しておいてももったいないので Qiita で公開します。
内容は多少古くなっているので注意しください。

インストール
------------

Rundeckをインストールします。今回使った環境は Ubuntu Linux 14.04 です。
使用した版はVersion 2.4.1です。これより古い版では、コマンド実行時の出力にASCII以外の文字が含まれていると、実行結果をそのままの形で扱えませんでした。
マルチバイト文字を正しく扱うために最新版を使用しましょう。

註) 2015-02-13 に 2.4.2 がリリースされました。

### 本稿の環境

Ubuntu 14.04

準備
----

http://rundeck.org/downloads.html からパッケージを入手します。

> Debian/Ubuntu Install
>
> [rundeck-2.4.1-1-GA.deb](http://dl.bintray.com/rundeck/rundeck-deb/rundeck-2.4.1-1-GA.deb "via bintray.com")
>
> Execute:
>
> `dpkg -i rundeck-2.4.1-1-GA.deb`

ファイルのチェックサムを確認します。

~~~~
% shasum rundeck-2.4.1-1-GA.deb 
5ce117bc994c6911bfbd46cc6a7f58b76e2e228f  rundeck-2.4.1-1-GA.deb
~~~~

スーパーユーザになってパッケージをインストールします。

~~~~
# dpkg -i rundeck-2.4.1-1-GA.deb  
Selecting previously unselected package rundeck.
(Reading database ... 58039 files and directories currently installed.)
Preparing to unpack rundeck-2.4.1-1-GA.deb ...
Unpacking rundeck (2.4.1) ...
dpkg: dependency problems prevent configuration of rundeck:
 rundeck depends on java6-runtime | java6-runtime-headless | java7-runtime | java7-runtime-headless; however:
  Package java6-runtime is not installed.
  Package java6-runtime-headless is not installed.
  Package java7-runtime is not installed.
  Package java7-runtime-headless is not installed.

dpkg: error processing package rundeck (--install):
 dependency problems - leaving unconfigured
Processing triggers for ureadahead (0.100.0-16) ...
Errors were encountered while processing:
 rundeck
~~~~

残念ながらエラーになりました。
RundeckはJavaアプリケーションであるため、Javaのランタイム環境が必要です。推奨パッケージも含め一括でインストールするため、aptitudeでopenjdk-7-jreをインストールします。

~~~~
# aptitude install openjdk-7-jre 
The following NEW packages will be installed:
  acl{a} at-spi2-core{a} ca-certificates-java{a} colord{a} cpp{a} 
  cpp-4.8{a} dbus-x11{a} dconf-gsettings-backend{a} dconf-service{a} 
  desktop-file-utils{a} fontconfig{a} fontconfig-config{a} 
  fonts-dejavu-core{a} fonts-dejavu-extra{a} gconf-service{a} 
  gconf-service-backend{a} gconf2{a} gconf2-common{a} gdisk{a} gvfs{a} 
  gvfs-common{a} gvfs-daemons{a} gvfs-libs{a} hicolor-icon-theme{a} 
  java-common{a} libasound2{a} libasound2-data{a} libasyncns0{a} 
  libatasmart4{a} libatk-bridge2.0-0{a} libatk-wrapper-java{a} 
  libatk-wrapper-java-jni{a} libatk1.0-0{a} libatk1.0-data{a} 
  libatspi2.0-0{a} libavahi-client3{a} libavahi-common-data{a} 
  libavahi-common3{a} libavahi-glib1{a} libbonobo2-0{a} 
  libbonobo2-common{a} libcairo-gobject2{a} libcairo2{a} libcanberra0{a} 
  libcloog-isl4{a} libcolord1{a} libcolorhug1{a} libcups2{a} libdatrie1{a} 
  libdconf1{a} libdrm-intel1{a} libdrm-nouveau2{a} libdrm-radeon1{a} 
  libexif12{a} libflac8{a} libfontconfig1{a} libfontenc1{a} libgconf-2-4{a} 
  libgconf2-4{a} libgd3{a} libgdk-pixbuf2.0-0{a} libgdk-pixbuf2.0-common{a} 
  libgif4{a} libgl1-mesa-dri{a} libgl1-mesa-glx{a} libglapi-mesa{a} 
  libgmp10{a} libgnome2-0{a} libgnome2-bin{a} libgnome2-common{a} 
  libgnomevfs2-0{a} libgnomevfs2-common{a} libgphoto2-6{a} 
  libgphoto2-l10n{a} libgphoto2-port10{a} libgraphite2-3{a} libgtk-3-0{a} 
  libgtk-3-bin{a} libgtk-3-common{a} libgtk2.0-0{a} libgtk2.0-bin{a} 
  libgtk2.0-common{a} libgudev-1.0-0{a} libgusb2{a} libharfbuzz0b{a} 
  libice6{a} libicu52{a} libidl-common{a} libidl0{a} libieee1284-3{a} 
  libisl10{a} libjasper1{a} libjbig0{a} libjpeg-turbo8{a} libjpeg8{a} 
  liblcms2-2{a} libllvm3.4{a} libltdl7{a} libmpc3{a} libmpfr4{a} 
  libnspr4{a} libnss3{a} libnss3-nssdb{a} libogg0{a} liborbit-2-0{a} 
  liborbit2{a} libpango-1.0-0{a} libpangocairo-1.0-0{a} 
  libpangoft2-1.0-0{a} libpciaccess0{a} libpixman-1-0{a} libpulse0{a} 
  libsane{a} libsane-common{a} libsecret-1-0{a} libsecret-common{a} 
  libsm6{a} libsndfile1{a} libtdb1{a} libthai-data{a} libthai0{a} 
  libtiff5{a} libtxc-dxtn-s2tc0{a} libudisks2-0{a} libv4l-0{a} 
  libv4lconvert0{a} libvorbis0a{a} libvorbisenc2{a} libvorbisfile3{a} 
  libvpx1{a} libwayland-client0{a} libwayland-cursor0{a} libx11-xcb1{a} 
  libxaw7{a} libxcb-dri2-0{a} libxcb-dri3-0{a} libxcb-glx0{a} 
  libxcb-present0{a} libxcb-render0{a} libxcb-shape0{a} libxcb-shm0{a} 
  libxcb-sync1{a} libxcomposite1{a} libxcursor1{a} libxdamage1{a} 
  libxfixes3{a} libxft2{a} libxi6{a} libxinerama1{a} libxkbcommon0{a} 
  libxmu6{a} libxpm4{a} libxrandr2{a} libxrender1{a} libxshmfence1{a} 
  libxt6{a} libxtst6{a} libxv1{a} libxxf86dga1{a} libxxf86vm1{a} 
  openjdk-7-jre openjdk-7-jre-headless{a} policykit-1-gnome{a} 
  sound-theme-freedesktop{a} tzdata-java{a} udisks2{a} x11-common{a} 
  x11-utils{a} 
The following packages will be upgraded:
  tzdata 
The following partially installed packages will be configured:
  rundeck 
1 packages upgraded, 168 newly installed, 0 to remove and 8 not upgraded.
Need to get 241 kB/83.8 MB of archives. After unpacking 257 MB will be used.
Do you want to continue? [Y/n/?] 
(中略)
Current status: 0 broken [-1], 8 updates [-1].
~~~~

JREがインストールできたので、Rundeckのパッケージをインストールします。

~~~~
# dpkg -i rundeck-2.4.1-1-GA.deb  
(Reading database ... 66206 files and directories currently installed.)
Preparing to unpack rundeck-2.4.1-1-GA.deb ...
Unpacking rundeck (2.4.1) over (2.4.1) ...
Setting up rundeck (2.4.1) ...
usermod: no changes
Processing triggers for ureadahead (0.100.0-16) ...
~~~~

インストールできました。サービスを起動します。

~~~~
# service rundeckd start
rundeckd start/running, process 58776
~~~~

起動には少し時間がかかります。ログが/var/log/rundeck/service.logに出力されているので確認してみます。

~~~~
# tail /var/log/rundeck/service.log 
2015-01-30 23:23:56.852:INFO:oejs.Server:jetty-7.6.0.v20120127
2015-01-30 23:23:58.750:INFO:oejw.StandardDescriptorProcessor:NO JSP Support for /, did not find org.apache.jasper.servlet.JspServlet
2015-01-30 23:23:59.925:INFO:/:Initializing Spring root WebApplicationContext
INFO  BootStrap: Starting Rundeck 2.4.1-1...
INFO  BootStrap: using rdeck.base config property: /var/lib/rundeck
INFO  BootStrap: loaded configuration: /etc/rundeck/framework.properties
INFO  BootStrap: RSS feeds disabled
2015-01-30 23:24:20.216:INFO:oejsh.ContextHandler:started o.e.j.w.WebAppContext{/,file:/var/lib/rundeck/exp/webapp/},/var/lib/rundeck/exp/webapp
2015-01-30 23:24:20.271:INFO:/:Initializing Spring FrameworkServlet 'grails'
2015-01-30 23:24:20.354:INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:4440
~~~~

`oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:4440` が出力されていれば起動が完了しています。

古いバージョンのパッケージを使ったときに、インストール後のいくつかアクセス権の設定がおかしく、エラーが出ているかもしれません。筆者が試したときは /tmp/rundeck の所有者が root ユーザになって書き込みエラーが出ていました。正しくは rundeck ユーザが所有者であるべきですので、修正してください。

~~~~
chown rundeck:rundeck /tmp/rundeckchmod 750 /tmp/rundeck
~~~~

初期設定
--------

デフォルトでは、Rundeck サービスのアクセス URL が

> http://localhost:4440

になっています。ソケット自体はIN6ADDR\_ANY\_INIT
でバインドしているため、どこからでもアクセスできるのですが、ログイン認証の後このURLにリダイレクトされてしまうため操作が継続できないと思います。

本稿では、SSH のダイナミックポートフォワードを利用して、Socks5プロキシ経由でアクセスしているため、このURLのままでも問題がないのですが、ほとんどの場合、デフォルトのままでは都合が悪いと思われます。

~~~
/etc/rundeck/rundeck-config.properties
~~~

に設定がありますのでこれを修正してください。

~~~~
grails.serverURL=http://localhost:4440
~~~~

修正後

~~~~
grails.serverURL=http://ホスト名orIPアドレス:4440
~~~~

I18N
----

デフォルトの設定ではコマンド出力がUTF-8なマルチバイトの文字を含むと、そこが ? に置換されてしまいます。rundeckdの実行時のcharsetがUTF-8になるように、/etc/rundeck/profileで

~~~~
LANG=en_US.UTF-8
export LANG
~~~~

あるいは

~~~~
LANG=ja_JP.UTF-8
export LANG
~~~~

を設定して起動する必要があります。

#### 注意

古い版では、そもそもマルチバイトな文字列が扱えませんでした。この問題はv2.4.1で修正されていますので、v2.4.1以上を使うようにしてください。


ログイン
--------

初期アカウントは、ユーザ名、パスワード共に admin です。

[![](http://1.bp.blogspot.com/-GbJwIWdsDag/VNSUePcxdSI/AAAAAAAAAdk/c1UFJvsQ9G8/s1600/login.png)](http://1.bp.blogspot.com/-GbJwIWdsDag/VNSUePcxdSI/AAAAAAAAAdk/c1UFJvsQ9G8/s1600/login.png)

ログインできればこのような画面が表示されるでしょう。

[![](http://3.bp.blogspot.com/-J35-E3mpKDg/VNSU5gfdfAI/AAAAAAAAAc8/LG6ECkJaWVo/s1600/welcome.png)](http://3.bp.blogspot.com/-J35-E3mpKDg/VNSU5gfdfAI/AAAAAAAAAc8/LG6ECkJaWVo/s1600/welcome.png)

ユーザアカウント
----------------

認証情報は/etc/rundeck/realm.propertiesで設定します。

形式は次の通りです。

> `<username>:<password>[,<rolename> ...]`


初期状態ではadminユーザのデフォルトパスワードは平文で書かれていますが、これを秘匿するには次のようにします。

~~~~
# java -cp /var/lib/rundeck/bootstrap/jetty-all-7.6.0.v20120127.jar org.eclipse.jetty.util.security.Password username password
~~~~

Rundeckの[管理者マニュアル](http://rundeck.org/docs/jp/administration/09-authentication.html)に書かれているコマンドは古いJettyのときのものなので使用できません。現在のJetty 7での方法は[こちら](https://wiki.eclipse.org/Jetty/Howto/Secure_Passwords)を参照してください。

> https://wiki.eclipse.org/Jetty/Howto/Secure_Passwords

MD5の形式でよければ、つぎのワンライナーでも作成できます。

> `printf "MD5:%s" $(read -sp "Password: " passwd; echo "$passwd") | md5sum`

#### 実行例

~~~~
# java -cp /var/lib/rundeck/bootstrap/jetty-all-7.6.0.v20120127.jar org.eclipse.jetty.util.security.Password admin admin
admin
OBF:1u2a1toa1w8v1tok1u30
MD5:21232f297a57a5a743894a0e4a801fc3
CRYPT:adpexzg3FUZAk
~~~~

出力の OBF:, MD5:, CRYPT: 行のいずれかを<password\>として設定します。ハッシュ形式を示すOBF:, MD5:,
CRYPT:の部分も必要です。

~~~~
admin:MD5:21232f297a57a5a743894a0e4a801fc3,user,admin,architect,deploy,build
~~~~

ファイルを変更すると、つぎの認証からは新しい値が使用されます。サービスの再起動は不要です。

SSH 鍵の作成
------------

Rundeckがコマンド実行際に使用するデフォルトのSSH鍵を作成しておきます。

プロジェクトごとに認証に使用する鍵を指定することができますので、からなずしもこの鍵を使う必要はありません。

~~~~
# mkdir /var/lib/rundeck/.ssh
# chown rundeck:rundeck /var/lib/rundeck/.ssh
# chmod go-rwx /var/lib/rundeck/.ssh
# ssh-keygen -t rsa -f /var/lib/rundeck/.ssh/id_rsa -N '' -C Rundeck
Generating public/private rsa key pair.
Your identification has been saved in /var/lib/rundeck/.ssh/id_rsa.
Your public key has been saved in /var/lib/rundeck/.ssh/id_rsa.pub.
The key fingerprint is:
83:06:12:c0:bc:29:96:b3:1b:ae:c7:f8:71:b9:53:37 Rundeck
The key's randomart image is:
+--[ RSA 2048]----+
|+..              |
| o .             |
|  = .            |
|.* . . .         |
|o o   o S        |
| o   o. E.       |
|.o+ o. . .       |
|.ooo..           |
|oo. ..           |
+-----------------+
# chown rundeck:rundeck /var/lib/rundeck/.ssh/id_rsa*
~~~~

つぎは[プロジェクトの作成](http://qiita.com/komeda-shinji/items/5f7b4cf795063d204500)をします。