Rundeckによるジョブスケジューリング

# Rundeckとは
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416540/d0718a7b-369f-2f4c-22e4-1db7d7156ea3.png)

https://www.rundeck.com/open-source

RundeckはOSSのジョブスケジューラーです。
ノード間で簡単に自動化されたタスクを実行できます。

# なぜRundeck??

世間では、 ジョブスケジューリングに関して`crond`をつかったり
Kubernetesを使っている際は`CronJob`使いますよね？

ただ、これらを用いる際、

- Slack通知は⾃分で作り込む必要がある
- ジョブの並列実⾏がぎこちない。。。
 
などがあります。

Rundeckでは、

上記のことが、簡単にでできるうえに

`ジョブの成功/失敗をメールやSlackに通知できる`
`ログをWebUI上で⾒られるようできる`

これは使うしかないでよね！

# hands-on

今回は簡単にさわれるように、dockerにデプロイして、実際に時間に合わせて、ジョブを打ってみます。

## インストール

まず作業用ディレクトリを作成して、その中で作業しましょう。

```
# mkdir rundeck
```

以下のファイルを作ります。

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

services:
    rundeck:
        image: rundeck/rundeck:SNAPSHOT
        hostname: rundeck
        links:
          - mysql
        environment:
            RUNDECK_DATABASE_DRIVER: com.mysql.jdbc.Driver
            RUNDECK_DATABASE_USERNAME: rundeck
            RUNDECK_DATABASE_PASSWORD: password
            RUNDECK_DATABASE_URL: jdbc:mysql://mysql/rundeck?autoReconnect=true&useSSL=false
            RUNDECK_GRAILS_URL: http://<サーバのIP>:4440
        volumes:
          - ${RUNDECK_LICENSE_FILE:-/project/null}:/home/rundeck/etc/rundeckpro-license.key
          - /root/project/rundeck/projects/:/home/rundeck/projects/
          - /root/project/rundeck/scripts:/home/rundeck/scripts/
          - /root/.ssh:/home/rundeck/.ssh/
          - /etc/hosts:/etc/hosts
        ports:
          - 4440:4440
    mysql:
        image: mysql:5.7
        environment:
          - MYSQL_ROOT_PASSWORD=password
          - MYSQL_DATABASE=rundeck
          - MYSQL_USER=rundeck
          - MYSQL_PASSWORD=password
        volumes:
          - dbdata:/var/lib/mysql

volumes:
    dbdata:
```

`RUNDECK_GRAILS_URL`には気を付けてください。

自分の環境ではNAT越しにアクセスをしているので、[NATのIP]:[フォワーディングしたport]を設定しました。
例えば、ここで間違えてdocker serverののprivate IPを書いた場合、最初のログイン画面で「login」を押すと、docker serverのprivate IPにリダイレクトされて見れなくなります。


その後、

```
# mkdir projects 
# mkdir scripts
```

確認します。

```
# ls rundeck
docker-compose.yml  projects  scripts
```

## コンテナの立ち上げ

```
# docker-compose up -d
```

## Rundeckの操作

### ログイン

では、ログインしていきましょう。

http://localhost:4440/user/login

![01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416540/338d41ff-d7a0-3a08-8fdd-d9d45723ddef.png)

### projectの作成

`新しいプロジェクト`よりプロジェクトを作ります。
今回は、ここのdefaultのみ埋めるだけで大丈夫です。

そしたら、`作成`を押します。

![02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416540/6f04a16f-f5b2-d7d1-409c-e315bda60e60.png)



### jobの作成

左の`ジョブ`タブを選択します。
そしたら、`新しいジョブの作成`を選択します。

![03.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416540/3afd850e-fbb5-60d0-9e36-5ea69bfccd6b.png)


#### 1. default

まず、`job名`を入力します。
`説明は`必要に応じて埋めてください。

![04.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416540/00275770-e2a2-8350-ae94-e3118ba19938.png)

#### 2. workflow

複数のステップを用意する場合は、ワークフローで

- 失敗したステップで停止する。
- 残りのステップを実行する。 

を選択してあげてください。(defaultは「失敗したステップで停止する。」)

![05-a.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416540/5797e54c-fd8d-ea9c-5974-6f32cdf9485e.png)


ここでは、jobを実行する際の基盤を選択し、そのうえで実行するjobを定義します。

- command
- sctipt

等のような、簡易的なものだけでなく

- Ansible playbook

なども用意されています。

![05-b.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416540/d86e1d32-ab9a-ffc9-cb80-6f735b0c5bdb.png)


![05-c.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416540/97dc2f86-b393-425b-12f1-4da1d85e477a.png)

#### Nodes

今回はlocalで行うのでそのままです。
リモートのサーバを登録していて、そちらを用いる場合は、`ノードに割り当てる`を選択します。

![06.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416540/0f2535d9-fcd0-c7f0-a39a-0416cca94e02.png)


#### Schedule

ここで、スケジューリングの設定を行います。

![07.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416540/8e8aa5ee-c173-1d0e-585b-8c7e85ec7993.png)


時間の記述タイプは、

- simple

![07-b.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416540/319d94cb-849b-d0d3-7468-4f75e17b5f84.png)


- crontab

![07-c.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416540/a62f123d-34a3-5525-c822-f4de27d2c20f.png)


の２つが用意されています。


#### Notificatoin

こちらは、必要に応じて設定してください。

#### 作成したjobの確認

 こんな感じに表示されます。

![08.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416540/09cbc0db-b1e6-a4a3-e8ee-ee84a3f561c0.png)


#### jobの実行後

jobが実行された後は、このようにアクティビティが増えていきます。
日付にカーソルを当て、選択しましょう。

![09.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416540/77389cb4-773e-8c9c-e147-9d021b9a6f56.png)


このように今回実施されたjobの詳細情報が記述されています。

![10.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416540/4c13d4aa-3974-504e-fa05-4dbc6f3a6610.png)


`ログ出力`を選択すると、以下のように今回打った`ls`の結果が表示されています。

![11.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416540/4fe91e50-552e-bbe3-1c1f-9c3d221efe4b.png)


うまく、ジョブスケジューリングが働きました。