Docker(Docker-Compose)でRundeckを構築

# 背景
プロジェクトの共有環境で、定期実行するコマンドをcronで実行していたが、実行しているコマンドをメンバー内で可視化するために、ジョブマネージャであるRundeckを用いてコマンドを実行することにした。

# Rundeckを選択した理由
- OSSである(＝有償ではない)
- UIがリッチで直感的に使用できる
- プロジェクトメンバに利用経験者がいる

# 構築環境
- OS             : Ubunt 20.04.4 LTS
- Docker         : 20.10.17, build 100c701
- Docker compose : version 1.29.1, build c34c88b2

### フォルダ構成
``` 
rundeck 
 ├─ rundeck 　　   : rundeckのデータを格納
 │  ├─ data 　　   : rundeckのデータを格納
 │  ├─ job   　　  : rundeckで実行したジョブの実行結果を格納
 ├─ mysql
 │  └─ db   　　   : dbデータを格納
 └─ docker-compose.yaml
```

### Docker Compse
共通
- Rundeckは、デフォルトでH2データベースを利用するようになっているが、本番環境での利用は非推奨となっていので、念のため、MySQLを使用する。別コンテナを作成するため、Docker-composeで構成を作成する
- Docker composeのバージョンは作成時に最新のバージョンだった3.8を指定する

Rundeck
- 作成時(2024/07/16)の最新バージョンである5.4.0を指定する
- コンテナのタイムゾーンをホストサーバと合わせるために、ホストサーバの/etc/localtimeをマウントする [^1]
- 実行結果などのログを記録するために以下を永続化する[^2]
/home/rundeck/var/logs

MySQL
- mysqlは、デフォルトの文字コードがlatin1になっているので、utf-8を指定する
これを指定しないと、Rundeckのジョブ名称や実行コマンドで日本語を使用できない
mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
- コンテナのタイムゾーンをホストサーバと合わせるために、環境変数にTZ=Asia/Tokyoを指定する[^1]

```
version: '3.8'

services:
  rundeck:
    image: rundeck/rundeck:5.4.0
    environment:
      RUNDECK_DATABASE_DRIVER: org.mariadb.jdbc.Driver
      RUNDECK_DATABASE_USERNAME: rundeck
      RUNDECK_DATABASE_PASSWORD: rundeck
      RUNDECK_DATABASE_URL: jdbc:mysql://mysql/rundeck?autoReconnect=true&useSSL=false
      RUNDECK_GRAILS_URL: http://＜ホストサーバのIPアドレス｜ホスト名称＞:4440
    volumes:
      - ./rundeck/data:/home/rundeck/server/data
      - ./rundeck/job:/home/rundeck/var/logs/rundeck
      - /etc/localtime:/etc/localtime:ro
    ports:
      - 4440:4440
  mysql:
    image: mysql:5.7
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=rundeck
      - MYSQL_USER=rundeck
      - MYSQL_PASSWORD=rundeck
      - TZ=Asia/Tokyo
    volumes:
      - ./mysqld:/var/lib/mysql
    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci

```

# 起動＆ログイン
``` 
user@server:/home/com/rundeck$ docker-compose up -d
```
起動にはしばらく時間がかかるので待つ。

http://＜ホストサーバのIPアドレス｜ホスト名称＞:4440にアクセスする。
下記のログイン画面が表示されたら起動完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404547/342f5656-3754-2370-737c-da1bcf02a144.png)

Username：admin, Password：adminを入力してログイン
下記の画面が表示されれば、ログイン完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404547/563e3641-c5cf-0a28-8a9e-a248b7b058f2.png)

# ジョブ実行の確認
正常に環境構築できたことを確認するために、ジョブの実行を試行する。
ジョブを登録するためには、プロジェクトが必要になるため作成する。
### プロジェクトの作成
「Create New Projekut＋」を押下して、プレジェクト作成画面に遷移する。
以下の画面でプロジェクトの情報を入力して、「作成」を押下する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404547/9e25ddc3-728f-702f-4c8e-fa13c60514dc.png)

### ジョブの作成
左サイドバーのジョブを押下して、ジョブ管理画面に遷移する。
ジョブ管理画面にて、「新しいジョブを作成」を押下する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404547/cd621786-b10c-8374-e0e1-83a47d6461b1.png)

新規ジョブ作成画面にて、「details」と「Workflow」を設定する。
1. 「details」タブで、ジョブ名を登録する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404547/8b3449be-7105-693c-b566-4118abe417e4.png)


2-1. 「Workflow」で、ステップとして「command」を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404547/182fb430-cda9-6c03-b4f5-6e6e910ce6c8.png)

2-2. 「command」に、実行するコマンドを入力する。
入力後、「保存」→「作成」と順に押下する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404547/32922a8a-f7c5-6a81-045d-c7cab25facec.png)

「今すぐジョブを実行」を押下して、登録したコマンドを実行する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404547/68256485-1e46-5775-2d41-1db1fdec712f.png)

正常に実行が完了した場合は、以下の画面が表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404547/1aaf11c1-7707-ba18-e4a0-7dce1b69db0b.png)

無事に実行することができましたら、環境構築は完了です！

# 参考
rundeck公式 dockerでのインストール
https://docs.rundeck.com/docs/administration/install/docker.html

rundeck公式 docker-composeサンプル
https://github.com/rundeck/docker-zoo

rundeck構成概要
https://docs.rundeck.com/docs/administration/configuration/database/

# 追記
### 2024/07/22
- 実行結果などのログを記録するために永続化するディレクトリが、特定のプロジェクトだけになっていたので修正
- コンテナ実行ユーザを指定するようにdocker-composeを修正

[^1]:DockerイメージがAlpineなど、/etc/localtimeも/usr/share/zoneinfo/も存在していない場合は、環境変数TZを指定しても、タイムゾーンは変更されない。
ホストにある/usr/share/zoneinfo/Asia/Tokyoをコンテナの/etc/localtimeにコピーかマウントすることでタイムゾーンを変更することができる。

[^2]:rundeckのバックアップを rundeck自身で取る
https://qiita.com/spamoc/items/7b1f62fb3e14cd48d349