背景
プロジェクトの共有環境で、定期実行するコマンドを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
/home/rundeck/server/data - コンテナの実行ユーザが、ログ出力先フォルダの所有者ではない場合、パーミッションエラーが発生してRundeckのジョブ実行に失敗する
回避方法はいろいろあるが、コンテナの実行ユーザをホスト側の実行ユーザに指定して実行する3
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
- /etc/passwd:/etc/passwd:ro
- /etc/group:/etc/group:ro
user: 1000:1000
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にアクセスする。
下記のログイン画面が表示されたら起動完了
Username:admin, Password:adminを入力してログイン
下記の画面が表示されれば、ログイン完了
ジョブ実行の確認
正常に環境構築できたことを確認するために、ジョブの実行を試行する。
ジョブを登録するためには、プロジェクトが必要になるため作成する。
プロジェクトの作成
「Create New Projekut+」を押下して、プレジェクト作成画面に遷移する。
以下の画面でプロジェクトの情報を入力して、「作成」を押下する。
ジョブの作成
左サイドバーのジョブを押下して、ジョブ管理画面に遷移する。
ジョブ管理画面にて、「新しいジョブを作成」を押下する。
新規ジョブ作成画面にて、「details」と「Workflow」を設定する。
2-1. 「Workflow」で、ステップとして「command」を選択する。
2-2. 「command」に、実行するコマンドを入力する。
入力後、「保存」→「作成」と順に押下する。
「今すぐジョブを実行」を押下して、登録したコマンドを実行する。
無事に実行することができましたら、環境構築は完了です!
参考
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を修正
-
DockerイメージがAlpineなど、/etc/localtimeも/usr/share/zoneinfo/も存在していない場合は、環境変数TZを指定しても、タイムゾーンは変更されない。
ホストにある/usr/share/zoneinfo/Asia/Tokyoをコンテナの/etc/localtimeにコピーかマウントすることでタイムゾーンを変更することができる。 ↩ ↩2 -
rundeckのバックアップを rundeck自身で取る
https://qiita.com/spamoc/items/7b1f62fb3e14cd48d349 ↩ -
Dockerコンテナの実行ユーザーと権限の関係
https://qiita.com/yitakura731/items/36a2ba117ccbc8792aa7 ↩