Rundeck(v3.x)を紐解く

## 基本知識
インストール方法とかは公式ドキュメントを参照してください。

### 起動・停止
```
$ sudo service rundeckd [start, stop, restart, condrestart, status]
```

### ディレクトリ構成

ディレクトリの設定は/etc/rundeck/framework.propertiesで変更できる。
デフォルトでは以下のようになっている。

```framework.properties
# ----------------------------------------------------------------
# Installation locations
# ----------------------------------------------------------------

rdeck.base=/var/lib/rundeck

framework.projects.dir=/var/lib/rundeck/projects
framework.etc.dir=/etc/rundeck
framework.var.dir=/var/lib/rundeck/var
framework.tmp.dir=/var/lib/rundeck/var/tmp
framework.logs.dir=/var/lib/rundeck/logs
framework.libext.dir=/var/lib/rundeck/libext

```

```
etc/
　├ rundeck/
　│　├ framework.properties …Rundeckコアの設定を定義(URL、使用ポート、ディレクトリパスなど)
　│　├ rundeck-config.properties …Rundeck WebAppの設定を定義
　│　├ realm.properties …Rundeckログインユーザーを定義
　│　└ {username}.aclpolicy …アクセス権限の設定を定義 Rundeckは/etc/rundeck配下の*.aclpolicyを全て読み込むので、設定したいユーザー名でファイルを作る
　└ default/
　 　└ rundeckd …起動オプションの設定 /etc/rundeck/profileをオーバーライドする
 
 
var/
  └ lib
      └ rundeck
           ├ data …Rundeckシステムデータ バックエンドをRDBに変更していれば空になる
           ├ projects …各プロジェクトの設定
           └ var …varディレクトリ ここにkey storageを配置したりする
```

### Projects
ジョブをまとめるプロジェクト。

### Job
そのままだが、ジョブ。
1つのジョブに複数のStepを指定できる。

### rd
RundeckのCLIコマンドツール。[公式はこちら](https://rundeck.github.io/rundeck-cli/)

java8が動く環境ならすぐに使える。

```
$ wget https://github.com/rundeck/rundeck-cli/releases/download/v1.3.1/rundeck-cli-1.3.1-all.jar

// Rundeck GUIのURL
$ export RD_URL=http://localhost:4440

// Rundeck GUIのログイン情報
$ export RD_USER=example
$ export RD_PASSWORD=example

$ java -jar rundeck-cli-x.y-all.jar

```

### Plugin
#### Storage 
`rundeck-config.properties`ファイルで定義されるデータの保管先。
keyとprojectの2つについて定義できる。

- dbストレージを使用するには：

```
[prefix].1.type=db
[prefix].1.path=/
```

- fileストレージを使用するには：

```
[prefix].1.type=file
[prefix].1.path=/
[prefix].1.config.baseDir=${framework.var.dir}/storage
```

prefixは以下の通り。

- key storage
    - `rundeck.storage.provider`
- project storage
    - `rundeck.config.storage.provider`

ちなみにdbとfileの両方に保管することもできる。

```
rundeck.storage.provider.1.type=db
rundeck.storage.provider.1.path=/keys

rundeck.storage.provider.2.type=file
rundeck.storage.provider.2.path=/keys/local
rundeck.storage.provider.2.config.baseDir=/var/local/rundeck
```

### Data
デフォルトではH2データベースをシステムバックエンドとして利用する。
物理パスは`/var/lib/rundeck/data`。

Jobが増えていくとH2では力不足になるためMySQLやMariaDBをバックエンドに使用するのがおすすめ。

#### Tables(要所だけ)
- execution
- base_report
    - ジョブ実行履歴
- storage
    - Storage pluginの保管先（？）
- project
    - プロジェクト
- workflow
    - job
- workflow_step
    - jobで実行するシェルコマンドが1レコードに入っている。`cd hoge`とか。
- workflow_workflow_step
    - workflow(ジョブ)とworkflow_step(実行コマンド)の関連テーブル
    - 2系だとインデックスが張られていなく、CPU不可を高める原因になっていたらしい
        - <span style="color: #d61b09">3系ではデフォルトでインデックスが張られていた。</span>

## Docker
そんなRundeckだが、実は公式がDockerイメージを提供してくれている。
https://hub.docker.com/r/rundeck/rundeck/

結論からいうと業務で使うには厳しい完成度だが、一応検証したので記録として残しておく。

### ディレクトリ構成
Linux版と大きく異るのがディレクトリ構成。
公式Rundeckイメージでは<span style="color: #d61b09">rootユーザーが公開されていない</span>ので、足りない権限でうまくやりくりしなければいけない。

```framework.properties
# ----------------------------------------------------------------
# Installation locations
# ----------------------------------------------------------------

rdeck.base=/home/rundeck

framework.projects.dir=/home/rundeck/projects
framework.etc.dir=/home/rundeck/etc
framework.var.dir=/home/rundeck/var
framework.tmp.dir=/home/rundeck/var/tmp
framework.logs.dir=/home/rundeck/var/logs
framework.libext.dir=/home/rundeck/libext
```

```
home/
　└ rundeck/
　 　├ etc …Rundeckコアの設定ファイルなど
　 　├ server/config …Rundeck WebAppの設定ファイルなど rundeck-config.propertiesはこっちに移植されてる
　 　└ var …var。ログが入ったりする
```

### rd
公式イメージには入っていないので、別コンテナで動かすか、自分でImageを焼き直すしかない。

```dockerfile:Dockerfile
FROM rundeck/rundeck:SNAPSHOT
WORKDIR /home/rundeck
RUN wget https://github.com/rundeck/rundeck-cli/releases/download/v1.3.1/rundeck-cli-1.3.1-all.jar
```

### compose
同一ホストでmysqlも動かすならこんな感じになる。

```docker-compose.yml
version: '3'

services:
  rundeck:
    image: rundeck:latest
    links:
      - mysql
    environment:
      # 公式が定義している環境変数　詳しくはdockerhubへ
      # だいたいrundeck-config.propertiesに記載される
      - RUNDECK_DATABASE_DRIVER=com.mysql.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://localhost:4440
      - RUNDECK_STORAGE_PROVIDER_1_TYPE=file
      - RUNDECK_MAIL_SMTP_HOST=x.x.x.x
      - RUNDECK_MAIL_SMTP_PORT=25
      - RUNDECK_MAIL_FROM=rundeck@example.com

      # rd用の環境変数
      - RD_URL=http://localhost:4440
      - RD_USER=admin
      - RD_PASSWORD=admin
    volumes:
      - ${RUNDECK_LICENSE_FILE:-/dev/null}:/home/rundeck/etc/rundeckpro-license.key
      - ./backup/jobs:/backup/jobs
      - ./backup/projects:/home/rundeck/projects
    ports:
      - 4440:4440
  mysql:
    image: mysql:5.7
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=rundeck
      - MYSQL_USER=rundeck
      - MYSQL_PASSWORD=rundeck
    volumes:
      - dbdata:/var/lib/mysql
volumes:
  dbdata:
```
環境変数は[dockerhub](https://hub.docker.com/r/rundeck/rundeck/)で公開されているが、明らかに足りない。（例えばカスタムメールテンプレートなど）
自分でrundeck-config.propertiesをマウントする方法も試したが、どうやらコンテナ作成時に環境変数を元にファイルを作り直してしまう模様。
そうなると起動後にsedで書き加えるくらいしか思いつかなかったので、結局Docker版を本番運用するのは厳しいという結論に至った。