GCEにRUNDECKをインストールして、Jobの結果をslackに通知する。私はCronをやめる。



## はじめに

GCLB配下のGCEにRUNDECKをインストールしましたが、GCLB配下に置いたときにhttpにリダイレクトされるようになって地味にハマった。。。

* 今回作成した環境は全てGCP(GCE)のCentOS7で作成しています。
* ロードバランサはGCLBを使用してます
* RUNDECKのバージョンは3.0.8の場合で記載してます。

## RUNDECKってそもそも何？

* OSSのジョブ管理ツール。
* WebのGUIでもAPIでも使える。
* 定期実行やワークフローによる制御も可能。
* コマンドやshellをRUNDECKから実行することが出来る。
* Ansibleと同じで、sshで接続するだけなので、エージェントのインストールが不要。
* Apache-2.0ライセンスのため、商用利用可。
* [Github](https://github.com/rundeck/rundeck)で2500以上のスターがついている。(スターの数は信頼の数ｗ)
* Community版と有料版(Enterprise)がある
* [Plugin](https://www.rundeck.com/integrations/plugins)が豊富で、Slack通知のプラグインや、Kubernetesプラグイン、vaultプラグイン、Ansibleプラグインなど、様々なプラグインがある。
* Javaで出来ている
* デフォルトはH2Databaseに[データを保存](https://rundeck.org/docs/administration/configuration/database/index.html)しているが、冗長構成をとるためにMySQL、SQLServer,Oracle,Postgresとかにすることも可能
* アカウント・権限(ACL)の管理も可能

### 期待出来ること

- CronJobピタゴラスイッチが無くなる
    - Job内でスクリプトやコマンドを直列、並列、シーケンシャルで実施するか等のワークフローを定義できる。
- どこで何のCronが動いてるか分からない問題が無くなる
    - 一元管理出来るので、呼び元がよく分からないCronとかが無くなり、見通しが非常に良くなる。
- いつの間にかにバックアップ止まってるやん・・・が無くなる
    - Jobのスタート時、完了時、エラー発生時などそれぞれ任意のタイミングでメールやSlackに通知することが出来る。


## インストール
以下のドキュメントを参照。
https://rundeck.org/docs/administration/install/centosredhat.html

### Rundeck本体のインストール

```shell
$ sudo yum install -y java
$ sudo rpm -Uvh http://repo.rundeck.org/latest.rpm
$ sudo yum install -y rundeck
$ sudo systemctl start rundeckd
```

以下の設定を入れないと、ログイン後にlocalhostにリダイレクトされる洗礼をうける。

```shell
$ sudo vi /etc/rundeck/rundeck-config.properties

#grails.serverURL=http://localhost:4440
grails.serverURL=http://YOUR_IP:4440

$ sudo systemctl restart rundeckd
```

### GCLB配下におくための設定

今どき平文で通信とか無いと思うので、https対応を行う。
今回はGCPのGCLBを使用して作成。

以下の設定を入れないと、ログイン後にhttpにリダイレクトされる洗礼をうける。

詳細は、https://rundeck.org/docs/administration/security/configuring-ssl.html を参照。

```shell
$ vi /etc/rundeck/rundeck-config.properties
server.useForwardHeaders=true #←これを追加する

$ sudo systemctl restart rundeckd
```

### Slack通知プラグインの導入

https://api.slack.com/apps にてAppを作っておく必要がある

```shell
$ curl -O https://github.com/rundeck-plugins/slack-incoming-webhook-plugin/releases/download/v1.2.2/slack-incoming-webhook-plugin-1.2.2.jar

$ cp ./slack-incoming-webhook-plugin-1.2.2.jar /var/lib/rundeck/libext/
```

ここで非常に重要なのが、[Fork元](https://github.com/higanworks/rundeck-slack-incoming-webhook-plugin)に記載されている↓をやること。
プロジェクト作成後にこれをやらなかったら、Slackの項目が出てこなかった。
そもそもList Pluginsに出てこなかったので、読み込みすらされてなさそうだった。

>WebHook URL: Slack incoming-webhook URL. Must be set at the project (or global rundeck level) by editing the project properties file, either by going to YOUR PROJECT > Project Settings > Edit Configuration > Edit Configuration File and adding the webhook URL as show below:

## RUNDECKのログイン

デフォルトは `admin/admin`
後述するが、`/etc/rundeck/realm.properties`にアカウントの設定が記載されている

<img width="509" alt="スクリーンショット 2018-11-29 8.32.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/33101/82179eda-93eb-fea8-0b85-ecd57a234c3e.png">

## PROJECTの作成
左ペインのPROJECTSから `+ New Project`
Project Nameだけ入力して、あとはデフォルト。

デフォルトで使用されるsshキーは `/var/lib/rundeck/.ssh/id_rsa`にあるキーが使用される

<img width="1430" alt="スクリーンショット 2018-11-29 8.37.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/33101/f69c1904-f954-749a-c802-38014336ce14.png">

## NODES追加

プロジェクトを作っただけだと、以下の様にlocalhostしかない。
そのため、リモートのNodeを操作したい場合はNodeを追加する必要がある。
<img width="1422" alt="スクリーンショット 2018-11-29 8.40.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/33101/f331cdcf-5754-fc7f-fc47-5e989aa2f94b.png">

このNode追加がなぜかGUIじゃ出来ない。
意味が分からない。

rundeckの設定ファイルをゴニョゴニョしないといけない。

### project.propertiesの設定
詳しくは以下に載っている
https://rundeck.org/docs/administration/configuration/configuration-file-reference.html#project.properties

```shell:project.properties
vi /var/rundeck/projects/test-project/etc/project.properties


# 以下を追加
resources.source.1.type=file
resources.source.1.config.file=/var/rundeck/projects/test-project/etc/resources.xml # ← `test-project`は適宜変更
resources.source.1.config.generateFileAutomatically=true
resources.source.1.config.includeServerNode=true
```

### resources.xmlの設定
上記で定義したresource.xmlファイルを新規で作成する
https://rundeck.org/docs/man5/resource-xml.html

```xml:resources.xml
vi /var/rundeck/projects/test-project/etc/resources.xml

<?xml version="1.0" encoding="UTF-8"?>
<project>
  <node name="rundeck-test" type="Node"
     description="test"
     hostname="130.211.XXX.XXX"
     username="rundeck" tags="test,nginx"
     />
  <!-- 複数ある場合は上記のnodeを追加していく -->
</project>
```

再起動する必要なく、動的に以下が追加されている

![スクリーンショット 2018-11-29 10.48.34.png](https://qiita-image-store.s3.amazonaws.com/0/33101/5f7c67d2-4bf6-f31c-b362-927efefc5f70.png)


## ユーザー追加

このユーザー追加もなぜかGUIじゃ出来ない。
意味が分からない。

Node追加同様、rundeckの設定ファイルをゴニョゴニョしないといけない。

https://rundeck.org/docs/administration/configuration/configuration-file-reference.html#realm.properties
https://rundeck.org/docs/administration/security/authenticating-users.html#propertyfileloginmodule


特定のプロジェクトをいじれるユーザーを作成する

今回は `test-project`の全権限があるユーザーを作成する

```shell

vi /etc/rundeck/realm.properties

testadmin:testadmin,user # ←これを追加

```

ACLを設定する
https://rundeck.org/docs/man5/aclpolicy.html

contextには以下の2つがある。


1. project　：ポリシーが適用されるプロジェクトの名前を宣言。その値は文字列であり、正規表現にすることができる。この正規表現には、プロジェクト名が一致する必要がある。
2. application : アプリケーションセクションを宣言。サポートされる唯一の値はrundeck。

```yaml
vi /etc/rundeck/testadmin.aclpolicy


description: Project settings for testadmin
context:
  project: 'test-project'
for:
  resource:
    - allow: '*'
  adhoc:
    - allow: '*'
  job:
    - allow: '*'
  node:
    - allow: '*'
by:
    username: testadmin

---

description: Application level access for testadmin
context:
  application: 'rundeck'
for:
  resource:
    - equals:
        kind: project
      deny: [create] # deny create of projects
    - equals:
        kind: system
      deny: [read,enable_executions,disable_executions,admin]  #deny read of system info, enable/disable all executions
    - equals:
        kind: system_acl
      deny: [read,create,update,delete,admin] # deny modifying system ACL files
    - equals:
        kind: user
      deny: [admin] # deny modify user profiles
  project:
    - match:
        name: 'test-project'
      allow: [read] # test-projectだけが見られるようにする

by:
  username: testadmin
```

## jobの作成

### jobの名前などをつける

Descriptionはmarkdownで書ける。

![スクリーンショット 2018-11-29 13.10.17.png](https://qiita-image-store.s3.amazonaws.com/0/33101/5fc3c04d-d23b-e93b-c7be-589aa3773f85.png)


### workflowを作成する
今回はScriptを選択した。
![スクリーンショット 2018-11-29 13.11.41.png](https://qiita-image-store.s3.amazonaws.com/0/33101/241aca5c-9e83-2f06-f252-02fc3f95bdf4.png)

![スクリーンショット 2018-11-29 13.12.07.png](https://qiita-image-store.s3.amazonaws.com/0/33101/95185846-69d8-216e-7c77-e18976de01d3.png)

### Nodeを選択する

Remoteに実行するので、 `Dispatch to Nodes`を選択。
Node Filterで　`Show all nodes`で出すと、先程登録したNodeが表示されるので、それを選択する。
 
![スクリーンショット 2018-11-29 13.14.22.png](https://qiita-image-store.s3.amazonaws.com/0/33101/e7ffefbe-9529-4c1f-588e-155bdcc4ff83.png)

### Notificationを設定する

よしなにSlackの通知を設定する

以下の単位で通知の On/Offが切り替えられる。

* On Success
* On Failure
* On Start
* Average Duration Exceeded
* On Retryable Failure

![スクリーンショット 2018-11-29 13.16.43.png](https://qiita-image-store.s3.amazonaws.com/0/33101/fba3b443-0d02-6198-162c-cc47d2307f83.png)

### Scheduleを設定する

以下の2タイプから選択可能

* Simple
* Cron

Timezoneとかの指定も親切なUI

#### Simple
![スクリーンショット 2018-11-29 13.24.29.png](https://qiita-image-store.s3.amazonaws.com/0/33101/8139e085-872a-3a7f-1a8b-550ea3f9db9f.png)

#### Cron
![スクリーンショット 2018-11-29 13.26.25.png](https://qiita-image-store.s3.amazonaws.com/0/33101/d588756a-1ccd-88a4-dd33-74cedebed48e.png)


### Timeoutを設定する
Timeoutを設定してないと延々とやってしまう・・・
![スクリーンショット 2018-11-29 13.23.08.png](https://qiita-image-store.s3.amazonaws.com/0/33101/a05b70f7-47e2-9737-9487-8688127b18a3.png)

### タスク登録完了
以下のように設定される。
![スクリーンショット 2018-11-29 13.28.36.png](https://qiita-image-store.s3.amazonaws.com/0/33101/ea41933f-12a7-71ce-5399-a751f510e118.png)

## いざ実施
登録したタスクを `Run Job Now`で実施する

FireWallRule、メタデータ(GCPのsshキーを登録するところ)追加するの忘れてた・・・


![スクリーンショット 2018-11-29 13.30.33.png](https://qiita-image-store.s3.amazonaws.com/0/33101/46865d50-c5f9-152d-86e5-571393f92b71.png)
![スクリーンショット 2018-11-29 13.31.15.png](https://qiita-image-store.s3.amazonaws.com/0/33101/54f9355e-6569-a717-1985-22a8b0adb6dd.png)

ちなみに、rundeckのsshキーは以下に登録されている。

```shell
# ls -lhA /var/lib/rundeck/.ssh/
total 12K
-rw-------. 1 rundeck rundeck  407 Nov 27 00:03 authorized_keys
-rw-------. 1 rundeck rundeck 1.7K Nov 25 12:46 id_rsa
-rw-r--r--. 1 rundeck rundeck  390 Nov 26 00:07 id_rsa.pub
```

## 気を取り直して、いざ実施

![スクリーンショット 2018-11-29 14.04.18.png](https://qiita-image-store.s3.amazonaws.com/0/33101/e8e0b838-819c-3c17-7da5-42dbcb622769.png)

![スクリーンショット 2018-11-29 14.04.57.png](https://qiita-image-store.s3.amazonaws.com/0/33101/0786bc04-82ad-bcc5-2ca0-f02ad5b04643.png)