ラベル dkron の投稿を表示しています。 すべての投稿を表示
ラベル dkron の投稿を表示しています。 すべての投稿を表示

2019年5月17日金曜日

dkron で結果を Slack に通知してみた

概要

dkron にはジョブの実行結果を通知する仕組みがあります
dkron Pro であれば Processors を使って実現できますが OSS 版には通知用の Processors がありません
OSS 版にも File, Log, Syslog Processors はありますがメールや Slack に通知するための Processors はありません
が、OSS 版でも Slack に通知する機能はあります
Pro 版とのジョブごとに異なるチャネルに通知することができないくらいです

環境

  • Ubuntu 16.04 LTS
  • dkron 1.2.4

ジョブの登録

ジョブは何でも OK です
とりあえず Shell executor を使って定期的にコマンドを実行するジョブを登録します

curl localhost:8080/v1/jobs -XPOST -d '{
  "name": "job1",
  "schedule": "@every 30s",
  "timezone": "Asia/Tokyo",
  "owner": "hawksnowlog",
  "owner_email": "hawksnowlog@gmail.com",
  "disabled": false,
  "tags": {
    "dkron_server": "true:1"
  },
  "concurrency": "allow",
  "executor": "shell",
  "executor_config": {
    "command": "date"
  }
}'

OSS 版の Slack の通知はジョブが成功しても失敗しても通知されます
ちなみに Pro 版の Slack Processor は onSuccess という設定で成功した場合も送信するか失敗した場合だけにするか設定することができます

Slack の設定を有効にする

次に Slack の通知を有効にします
Incomming Webhook の仕組みを使うので URL を事前に取得しておいてください
また設定は管理画面からは行えないので設定ファイルに直接記載します

  • sudo vim /etc/dkron/dkron.yml
webhook-url: https://hooks.slack.com/services/xxxxxxxxxx/xxxxxxxxxx/xxxxxxxxxxxxxxxxxxxx
webhook-payload: "{\"text\":\"A status of {{.JobName}} is {{.Success}}\",\"username\":\"DkronBot\",\"icon_url\":\"https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2LszE5GtwoK-DGY1onFDSRJ4y6hyphenhyphenTkB3PqKxuHgO9TYJ77RwDdy9Fa9DBOs_bWzkUOUqCg2oah1i5_GEGLs1ZyEoUIFIeRNZ87lwznv94tth9ReNahxhWyRFkMNDAaqoCll-VyvaGYdo/s1600/jarato.png\"}"
webhook-headers:
  - Content-Type:application/json

webhook-url は取得したものに変更してください
webhook-payload は Slack の Incomming Webhook で使える payload がそのまま指定できます
また golang のテンプレートを使うことができます
struct のフィールドが使用可能になっているようです
一覧はコードを直接見るしかありませんが以下が参照可能です
https://github.com/victorcoder/dkron/blob/master/dkron/notifier.go#L69

自分が試した感じだと {{.Report}} を使うと invalid payload になるためうまく通知できません
おそらく JSON のフォーマットに違反した情報が展開されてしまっているためだと思います (p-r 案件かなと)

設定ファイルに Slack の情報を記載したら dkron を再起動しましょう

  • sudo systemctl restart dkron

動作確認

あとは動作確認です
ジョブが失敗したときに Slack に通知がくれば OK です

今回は webhook-payload 内で channel の指定はしていないので通知されるチャネルは Incomming Webhook を作成した際に指定したデフォルトのチャネルになります
dkron.yml は dkron のグローバルな設定になるのですべてのジョブのエラーが通知されてしまいますが、一応こんな感じで Slack の通知を実現することはできました

Tips

dkron のログをチェックする

  • sudo journalctl --no-pager -u dkron.service | less

ログをデバッグ表示にする

  • vim /etc/dkron/dkron.yml
log-level: debug

最後に

OSS 版 dkron で Slack の通知を試してみました
dkron.yml に Incomming Webhook の URL を指定することで実現できますが、すべてのジョブに共通の設定になってしまいます
ちなみに Pro 版では Slack Processor という仕組みが使えます
dkron-processor-slack.yml にチーム単位で Incomming Webhook URL を指定することができ、そのチームをジョブに紐付けることでジョブごとに通知先を切り替えることができるようです
当然ですが OSS 版では使えないので試せませんでした

2019年5月16日木曜日

dkron 試してみた

概要

dkron は cron のスケジューリングを自動で行ってくれるツールです
ノードを追加していくことでスケジューリングされたジョブを各ノードで分散して実行してくれます
今回は 1 台の Ubuntu 上にインストールし簡単に使ってみました
docker でも動作しますがホストに直接インストールして使っています

環境

  • Ubuntu 16.04 LTS
  • dkron 1.2.4

インストール

  • sudo sh -c "echo 'deb [trusted=yes] https://apt.fury.io/victorcoder/ /' > /etc/apt/sources.list.d/dkron.list"
  • sudo apt -y update
  • sudo apt -y install dkron

systemd 配下に登録されているので systemctl コマンドが使えます

修正

  • sudo vim /lib/systemd/system/dkron.service
ExecStart=/usr/bin/dkron agent --server

--server が抜けている場合は追記してください

起動

  • sudo systemctl start dkron

これで localhost:8080 にアクセスすると管理画面が表示されます

ジョブ登録と確認

ジョブと呼ばれる単位で登録していきます
登録は管理画面からは行えないので API を使います
簡単な REST で登録できます
とりあえず 10s おきに date コマンドを実行するジョブを登録しましょう

curl localhost:8080/v1/jobs -XPOST -d '{
  "name": "job1",
  "schedule": "@every 10s",
  "timezone": "Asia/Tokyo",
  "owner": "hawksnowlog",
  "owner_email": "hawksnowlog@gmail.com",
  "disabled": false,
  "tags": {
    "dkron_server": "true:1"
  },
  "concurrency": "allow",
  "executor": "shell",
  "executor_config": {
    "command": "date"
  }
}'

schedule で実行する間隔を登録します
dkron は秒単位でスケジュールすることができます
cron のフォーマットでも可能ですが dkron 内で使える簡易記法もあります

tags はジョブの検索や実行するノードを指定するときに役立ちます

今回は dkron をインストールした Ubuntu 上でコマンドを実行するので executor は shell を指定しています
dkron にはいろいろな executor が用意されており例えば HTTP リクエスト送信するための executor などがあります

これでジョブの登録ができます
登録したジョブは API では以下のように取得できます

  • curl localhost:8080/v1/jobs
  • curl localhost:8080/v1/jobs/job1

詳細を取得する場合は /jobs/{job_name} を使ってください
また管理画面でもジョブの確認ができます

動作確認

一覧からジョブを選択すると実行結果を確認できます

API であれば executions をコールしましょう

  • curl localhost:8080/v1/jobs/job1/executions

ジョブを削除する

DELETE メソッドでコールするだけです

  • curl localhost:8080/v1/jobs/job1 -XDELETE

HTTP executor を使ってみる

先程は Shell executor を使いました
今度は HTTP executor を使ってみたいと思います
まずは登録します

curl localhost:8080/v1/jobs -XPOST -d '{
  "name": "job2",
  "schedule": "@every 1m",
  "timezone": "Asia/Tokyo",
  "owner": "hawksnowlog",
  "owner_email": "hawksnowlog@gmail.com",
  "disabled": false,
  "tags": {
    "dkron_server": "true:1"
  },
  "concurrency": "allow",
  "executor": "http",
  "executor_config": {
    "method": "POST",
    "url": "https://kaka-request-dumper.herokuapp.com/",
    "headers": "[\"Content-Type: application/json\"]",
    "body": "{\"key\":\"value\"}",
    "timeout": "30",
    "expectCode": "200",
    "expectBody": "",
    "debug": "true"
  }
}'

ポイントはやはり executor と executor_config です
リクエストの情報は executor_config でいろいろと設定します
今回は POST + JSON ボディを送信しています
headers に Content-Type: application/json を method に POST を設定します
そして body に JSON を設定するのですがここが文字列を設定しなければなりません
せっかくだったらそのまま JSON を書ければ良いと思って試したのですが Invalid Parameter Error になります
なのでダブルクオートなどはちゃんとエスケープしてあげましょう
expectCode と expectBody はレスポンスチェックに使えます
今回は expectCode だけ指定しています
その場合はステータスコードだけを見て成功かどうか判断します
expectBody も指定している場合はレスポンスボディもチェックして成功かどうかを判断します
失敗した場合は Not match the expected body となるようです

失敗した場合はジョブに設定したリトライ設定に応じてリトライするか諦めるかに分岐します

最後に

dkron を Ubuntu 上にインストールして Shell executor と HTTP executor を試してみました
基本は REST ベースでやり取りします
競合だと Jenkins などが近いかなと思います
まだ細かく使っていないので何とも言えませんが Executor をカスタムできたりすると便利なような気がします
また結果をメールや Slack で通知できたりするらしいのでその辺りも別記事で紹介したいと思います

参考サイト