WindowsのRundeck2環境にRundeck3をインストールする

Rundeckがバージョンアップしたので、自分のwindows環境へインストールしてみます。

#はじめに
Rundeckの説明は探せばいっぱい出てくるので省きます。簡単にいうとジョブスケジューラです。Windows環境でも動作するのでcronがないwindowsマシンでも動きます。退屈な仕事をやってもらうにの重宝しています。

#現行の動作環境について
タイトルどおり、現状はRundeck2が動いています。現状の動作環境はこんな感じです

- Windows7
- Rundeck2.7.3 (open-source版) build-inサーバーで動作
- MySQL 10.1.25-MariaDB(Xampp) 


Rundeckのマニュアルには、新規にインストールしプロジェクトやジョブをコピーしたほうがいいよ、って書いてあるので、2インスタンス構成にします。
>**Upgrading**
For the most part, Rundeck 3.0 is drop-in compatible with existing Rundeck 2.11 installations.
We recommend doing a fresh install of 3.0.0 and copying your Jobs/projects into it for testing.
If you are upgrading in-place, Be sure to backup import data/configs before upgrading.

http://rundeck.org/news/2018/07/27/rundeck-3.0.0.html

今回のゴールは

- Rundeck3を新規ディレクトリにインストールして、起動させる
- MySQLのデータベースも新しくセットアップする
- Rundeck3はRundeck2とポートのバッティングを避けるため、14440ポートで動かす

インストール完了後に、Rundeck2からのジョブの移行とか、権限設定とかやります。

#やってみよう
Rundeck3を起動させるところまで、やってみます。

##Rundeckのダウンロード
Windowsなので、普通にブラウザでアクセスしてバイナリ版をダウンロードします。
http://rundeck.org/downloads.html　

2018/8/8時点の最新版 ```rundeck-3.0.1-20180803.war``` をダウンロードしてきました。

##Rundeckをインストール
インストールディレクトリは、C:/rundeck3にします。フォルダを作成してダウンロードしたファイルをコピーします。Javaが必要なのでインストールしておいてください。マニュアルによると1.8以上が必要で、JAVA_HOMEも設定しておけとのこと。

>**Java**
Rundeck is a Java-Servlet based server and therefore requires the Java runtime.
The install process requires that the latest version of Java 8 be installed. Both the Open JDK and Sun/Oracle JVMs can be used. You must have the JAVA_HOME environment variable defined in your environment before running the launcher. The RPM will use the java found on your path. See Setting JAVA_HOME if you want to run a different version of java.

参照：http://rundeck.org/docs/administration/install/index.html

では、インストールします。コマンドプロンプトで実行可能です。

```
C:\rundeck3
λ java -version
java version "1.8.0_171"
Java(TM) SE Runtime Environment (build 1.8.0_171-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)

C:\rundeck3
λ ls
rundeck-3.0.1-20180803.war

C:\rundeck3
λ java -Xmx1024m -jar rundeck-3.0.1-20180803.war --installonly
```

インストールコマンドが終わると、ファイルが展開されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/168315/80ea90c8-7069-a6a9-c616-44eb8df7457b.png)

##httpポートの設定
デフォルトの4440ポートから14440ポートに変更します。ここが一番ハマりました。
答えから言うと、```rundeck-config.properties```に```server.port```を書き足すしかないらしいです。

```properties
#rss.enabled if set to true enables RSS feeds that are public (non-authenticated)
rss.enabled=false
server.address=HOSTNAME
#↓ここ追加
server.port=14440
grails.serverURL=http://HOSTNAME:14440
```

[System Property](http://rundeck.org/2.10.6/administration/installation.html#system-properties)を書き換えると動くとか、```framework.properties```を変えるとか、```preferences.properties```を変えるとか、いろいろ試しましたが、2018/8/8現在はどれもうまく動かないようです。4440で動かす人は全く気にしなくていいです。[^1]
[^1]: ISSUEが上がってました。https://github.com/rundeck/rundeck/issues/3786


##MySQLの設定
###データベース作成
今回はRundeck3用にMySQLのデータベースも新規に作ることにしたので、```rundeck3```というデータベースを作っておきます。ユーザとパスワードも一緒に作ります。

```
mysql -u root 
CREATE DATABASE rundeck3 DEFAULT CHARACTER SET utf8;
GRANT ALL PRIVILEGES ON rundeck3.* TO rundeckuser3@localhost IDENTIFIED BY 'password';
```

rootユーザでデータベースを作ります。rundeck3データベースにログインができることを確認しておきます。もちろんテーブルは何もないです。Rundeck2で使っているuserと同じuserを使ってRundeck3のDBに権限を与えると、Rundeck2側につながらなくなるので、気を付けてください。Rundeckの問題ではなくてMySQLの権限設定の問題です。[^3]

```bash
mysql -u rundeckuser3 -p rundeck3
MariaDB [rundeck3]> show tables;
Empty set (0.00 sec)
```

[^3]: https://teratail.com/questions/19342


###JDBCドライバのインストール
Rundeck3をbuild-inサーバーで動かすので、$RDECK_BASE/server/lib にMySQLのJDBCドライバをコピーします。tomcatにwarをデプロイする場合には、置き場所が違うので注意です。MySQLのJDBCドライバは[この辺からダウンロード](https://dev.mysql.com/downloads/connector/j/)してきてください。

参照：http://rundeck.org/2.10.6/administration/setting-up-an-rdb-datasource.html

###データベースの設定
RundeckがMySQLを使うように設定を変更します。

ファイルはここにあります。```C:\rundeck3\server\config\rundeck-config.properties```
追記しましょう

```properties:rundeck-config.properties
dataSource.dbCreate = update
dataSource.driverClassName=com.mysql.jdbc.Driver
dataSource.url = jdbc:mysql://localhost/rundeck3?autoReconnect=true
dataSource.username=rundeckuser3
dataSource.password=***
#これ、忘れていました。(2019/7/14)
rundeck.projectsStorageType=db

```

Rundeck3.0のReadMeにMySQLを使うときは、ドライバ名を書くようにとありましたので、ドライバ名も追加してます。、
>**Must define JDBC driver class name**
If using Mysql/other DBs which require a JDBC driver, be sure to specify it explicitly in the rundeck-config file, e.g. dataSource.driverClassName=com.mysql.jdbc.Driver

**Configure project config in DB**も合わせて設定します。これをやらないとプロジェクト情報はDBに保存されません。設定ファイルに1行追加するだけです。
https://docs.rundeck.com/2.10.6/administration/setting-up-an-rdb-datasource.html#configure-project-config-in-db

ここまででいったん準備は完了です。

##Rundeck3 起動
設定が一通り終わったら、skipinstall指定で実行してみます。

```
C:\rundeck3
λ java -Xmx1024m -jar rundeck-3.0.1-20180803.war --skipinstall -d
```

しばらく待つとコマンドプロンプトにログがたくさん出てきます。最後にログが出ればうまくいっているはずです。

```
2018-08-09 00:07:51.236  INFO --- [           main] rundeckapp.BootStrap                     : Starting Rundeck 3.0.1-20180803 (2018-08-04) ...

2018-08-09 00:07:51.238  INFO --- [           main] rundeckapp.BootStrap                     : using rdeck.base config property: C:/rundeck3
2018-08-09 00:07:51.272  INFO --- [           main] rundeckapp.BootStrap                     : loaded configuration: C:\rundeck3\etc\framework.properties
2018-08-09 00:07:51.285  INFO --- [           main] rundeckapp.BootStrap                     : RSS feeds disabled
2018-08-09 00:07:51.286  INFO --- [           main] rundeckapp.BootStrap                     : Using builtin realm authentication
2018-08-09 00:07:51.286  INFO --- [           main] rundeckapp.BootStrap                     : Preauthentication is disabled
2018-08-09 00:07:51.362  INFO --- [           main] rundeckapp.BootStrap                     : Rundeck is ACTIVE: executions can be run.
2018-08-09 00:07:51.847  INFO --- [           main] rundeckapp.BootStrap                     : Rundeck startup finished in 2651ms
Grails application running at http://HOSTNAME:14440 in environment: production
```

###気になるログ１
MySQLに繋ぐと、こんなログも出てくるかもしれません。何個かテーブルを作るのに失敗しているみたいです。なんだろ。。とりあえず、気にせず行きます。[^2]
[^2]: milestone 3.0.2 が設定されているので、近いうちに直りそう。https://github.com/rundeck/rundeck/issues/3785

```
2018-08-08 22:25:59.370  WARN --- [           main] o.h.t.s.i.ExceptionHandlerLoggedImpl     : GenerationTarget encountered exception accepting command : Error executing DDL via JDBC Statement

org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL via JDBC Statement
        at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:67)
        
(省略)

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Specified key was too long; max key length is 767 bytes
```

MySQLのデータベースを見てみると、21個テーブルはできています。

```
MariaDB [rundeck3]> show tables;
+----------------------------+
| Tables_in_rundeck3         |
+----------------------------+
| auth_token                 |
| base_report                |
| execution                  |
| job_file_record            |
| log_file_storage_request   |
| node_filter                |
| notification               |
| orchestrator               |
| plugin_meta                |
| project                    |
| rdoption                   |
| rdoption_values            |
| rduser                     |
| referenced_execution       |
| report_filter              |
| scheduled_execution        |
| scheduled_execution_filter |
| storage                    |
| workflow                   |
| workflow_step              |
| workflow_workflow_step     |
+----------------------------+
21 rows in set (0.00 sec)
```

ここで、Rundeckを一度停止します。

##JVMプロパティなど設定の追加
Rundeckを1回実行すると、```C:\rundeck3\etc``` フォルダにファイルがいくつか作られます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168315/90d45c67-1466-79a5-5ea1-cde152f738fe.png)

###起動ファイル作成
[マニュアルにあるとおり](http://rundeck.org/2.10.6/administration/installation.html#install-the-launcher-as-a-service)、```C:\rundeck3\startrundeck.bat```に起動用のファイルを作っておきます。やってることはprofile.batを読み込んでwarを実行するだけです。

```
set CURDIR=%~dp0
call %CURDIR%etc\profile.bat
java %RDECK_CLI_OPTS% %RDECK_SSL_OPTS% -jar rundeck-3.0.1-20180803.war --skipinstall -d
```

###profile.batの編集
```C:\rundeck3\etc\profile.bat``` ファイルにJVMオプションをいくつか書きます。

```
set RDECK_BASE=C:\rundeck3

set JAVA_HOME=C:\java8

rem :: Unsetting JRE_HOME to ensure there is no conflict with JAVA_HOME
rem (set JRE_HOME=)

set Path=%JAVA_HOME%\bin;%RDECK_BASE%\tools\bin;%Path%

set RDECK_SSL_OPTS="-Djavax.net.ssl.trustStore=%RDECK_BASE%\etc\truststore -Djavax.net.ssl.trustStoreType=jks -Djava.protocol.handler.pkgs=com.sun.net.ssl.internal.www.protocol"

set RDECK_CLI_OPTS=-Xmx1024m ^
-Dserver.http.port=14440 ^
-Dserver.https.port=14443 ^
-Dfile.encoding=UTF-8
set RD_LIBDIR=%RDECK_BASE%\tools\lib
```

RDECK_CLI_OPTSにメモリーオプション、http/httpsのポート、ファイルエンコーディングを指定しました。port指定は今のバージョンでは意味なさそうですが、未来のために。


##再起動
startrundeck.batで起動してみます

```
C:\rundeck3
 startrundeck.bat
```

ログがで終わったら、ブラウザでアクセスしてみます。HOSTNAME部分は自分のマシン名になっていると思いますので、書き換えてください。

http://HOSTNAME:14440/

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168315/16c6a6da-a2f7-1b98-2534-b49f2f849581.png)

見慣れた画面が出てきます。デフォルトでは、admin/adminでログインです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168315/e0db5bcf-d2f8-8cb7-15ee-abd37e5b175c.png)

ログイン成功です。

##ユーザ設定
Rundeck2と同じく、realm.properties　で設定可能です。

##タスクの移行
Rundeck2のタスクをYAMLでダウンロードして、Rundeck3にインポートはできました。比較的簡単なジョブしか組んでいないので、問題はおきませんでした。

##プラグイン
slackのプラグインは、Rundeck2と同じもので動きました。```C:\rundeck3\libext```のフォルダにプラグインのjarを置くだけで動きました。

slackに通知するところでエラーになっていたので、以下の設定を空白にして再起動したら動きました。

```bach:profile.bat
set RDECK_SSL_OPTS=
```

#このあとは
~~プロジェクトの設定~~、~~ユーザの設定~~、~~Rundeck2からのジョブの移行~~して動作確認をしたら、~~Rundeck2の停止~~するところまで進めます。3.x系で~~slackのプラグインが動くかどうかの確認~~ですね。


#ハマりどころメモ
**ログイン画面に戻ってしまう**
同じマシンで2つのRundeckのインスタンスが上がっている状態で、同じブラウザで複数のRundeckにログインすると、ジョブ登録などのアクションが完了せずにログイン画面に戻されることが何度かありました。おそらく、ログイン情報が新旧と共有されてしまっていて動かないの状態なのかと。ChromeとFirefoxでブラウザ自体を分けて使うとうまくいきました。