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 上でコマンドを実行するので executorshell を指定しています
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"
  }
}'

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

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

最後に

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

参考サイト

0 件のコメント:

コメントを投稿