September 25, 2017

Digdagで環境毎に設定値を変えたい時のTips

はじめに

久しぶりの更新になりましたが、DigdagネタでちょっとしたTipsを紹介する。

よくあるのが環境によって、 実行するIPアドレスやホスト名が違うというパターン。

以前にあった勉強会の時にも質問があったが、Twitterでも気になっているような声がちらほらあるので、これまで経験して得た知見としてまとめておく。

環境

今回サンプルで利用する環境は以下の通り

  • Digdag (v0.9.16)

サンプルに利用するdigファイル

Gist上にもアップロードしたので興味があればcloneして試すこともできる。

$ git clone https://gist.github.com/cfbf06bfdcbc3889653646d6e5705ede.git

まずは基本系から。
下記のようなdigファイルを作成して、sample.dig として保存した。
(仮に pg> オペレーターを使うことを想定している)

さて、これを実行するとどうなるか?

$ digdag run -a sample.dig
2017-09-25 21:39:53 +0900: Digdag v0.9.16
2017-09-25 21:40:05 +0900 [WARN] (main): Reusing the last session time 2017-09-25T00:00:00+00:00.
2017-09-25 21:40:05 +0900 [INFO] (main): Using session /Users/shota/gist/cfbf06bfdcbc3889653646d6e5705ede/.digdag/status/20170925T000000+0000.
2017-09-25 21:40:05 +0900 [INFO] (main): Starting a new session project id=1 workflow name=sample session_time=2017-09-25T00:00:00+00:00
2017-09-25 21:40:06 +0900 [INFO] (0018@[0:default]+sample+echo+host): echo>: 192.0.2.1
192.0.2.1
2017-09-25 21:40:06 +0900 [INFO] (0018@[0:default]+sample+echo+port): echo>: 5430
5430
2017-09-25 21:40:07 +0900 [INFO] (0018@[0:default]+sample+echo+database): echo>: production_db
production_db
2017-09-25 21:40:07 +0900 [INFO] (0018@[0:default]+sample+echo+user): echo>: app_user
app_user
Success. Task state is saved at /Users/shota/gist/cfbf06bfdcbc3889653646d6e5705ede/.digdag/status/20170925T000000+0000 directory.
  * Use --session <daily | hourly | "yyyy-MM-dd[ HH:mm:ss]"> to not reuse the last session time.
  * Use --rerun, --start +NAME, or --goal +NAME argument to rerun skipped tasks.

_export で設定したパラメータがそれぞれ出力されることがわかる。

ファイルからパラメーターを読み込む

さて、上記のままではパラメータがハードコードされているため使い勝手が非常によくない。
よって、パラメータだけファイルにして切り出してみる。

production.yml として下記を作成(わかりやすいようにいくつか値を変更済)

sample2.dig では、_exportを消してシンプルにしてしまおう。

さて、これを実行してみる。

$ digdag run -a sample2.dig --params-file production.yml
2017-09-25 23:23:22 +0900: Digdag v0.9.16
2017-09-25 23:23:33 +0900 [WARN] (main): Using a new session time 2017-09-25T00:00:00+00:00.
2017-09-25 23:23:33 +0900 [INFO] (main): Using session /Users/shota/gist/cfbf06bfdcbc3889653646d6e5705ede/.digdag/status/20170925T000000+0000.
2017-09-25 23:23:33 +0900 [INFO] (main): Starting a new session project id=1 workflow name=sample2 session_time=2017-09-25T00:00:00+00:00
2017-09-25 23:23:34 +0900 [INFO] (0018@[0:default]+sample2+echo+host): echo>: production
production
2017-09-25 23:23:34 +0900 [INFO] (0018@[0:default]+sample2+echo+port): echo>: 5432
5432
2017-09-25 23:23:34 +0900 [INFO] (0018@[0:default]+sample2+echo+database): echo>: production_db
production_db
2017-09-25 23:23:35 +0900 [INFO] (0018@[0:default]+sample2+echo+user): echo>: production_user
production_user
Success. Task state is saved at /Users/shota/gist/cfbf06bfdcbc3889653646d6e5705ede/.digdag/status/20170925T000000+0000 directory.
  * Use --session <daily | hourly | "yyyy-MM-dd[ HH:mm:ss]"> to not reuse the last session time.
  * Use --rerun, --start +NAME, or --goal +NAME argument to rerun skipped tasks.

実行した結果、ファイルから読み込まれた値が出てきているのがわかる。

このように、 --params-file <file_name> で実行時にパラメータのファイルから値を読み込むことができる。 ポイントとしては、 _exportinclude ! などは一切不要で --params-file で指定したファイルの変数が読み込まれるということ。

※ 注意点としてパラメータのファイルは .dig 拡張子を使わない方が良さそう。使った場合はタスクとしてのバリデーションが行われてしまい、タスク実行が失敗してしまった。

$ digdag run -a sample2.dig --params-file production.dig
2017-09-25 23:24:28 +0900: Digdag v0.9.16
error: Validating project failed
workflow /Users/shota/gist/cfbf06bfdcbc3889653646d6e5705ede/production.dig Workflow 'production' includes unknown keys: [pg] (model validation)

サーバ / クライアント構成の場合

ここまででパラメータをファイルから呼び出すところがわかった。

ではサーバ / クライアント構成の場合、どうすれば良いだろうか?

…答えは、digdagサーバの起動時にパラメータファイルを指定して読み込むことで起動すれば解決する。

試しにサーバを起動してみる。 タスク実行した時と同様に –params-file で指定する。

$ digdag server -m --params-file production.yml
2017-09-25 23:13:57 +0900: Digdag v0.9.16
2017-09-25 23:14:08 +0900 [INFO] (main): secret encryption engine: disabled
2017-09-25 23:14:08 +0900 [INFO] (main): XNIO version 3.3.6.Final
2017-09-25 23:14:08 +0900 [INFO] (main): XNIO NIO Implementation Version 3.3.6.Final
2017-09-25 23:14:08 +0900 [INFO] (main): Starting server on 127.0.0.1:65432
2017-09-25 23:14:08 +0900 [INFO] (main): Bound on 127.0.0.1:65432 (api)

タスクのdigファイルというと先程と同じシンプルなカタチでOK。

これを保存して実行してみる。

2017-09-25 23:15:18 +0900 [INFO] (XNIO-1 task-47): Starting a new session project id=1 workflow name=sample session_time=2017-09-25T14:15:18+00:00
2017-09-25 23:15:19 +0900 [INFO] (0077@[0:sample]+sample+echo+host): echo>: production
production
2017-09-25 23:15:19 +0900 [INFO] (0077@[0:sample]+sample+echo+port): echo>: 5432
5432
2017-09-25 23:15:20 +0900 [INFO] (0077@[0:sample]+sample+echo+database): echo>: production_db
production_db
2017-09-25 23:15:20 +0900 [INFO] (0077@[0:sample]+sample+echo+user): echo>: production_user
production_user
^C2017-09-25 23:15:31 +0900 [INFO] (shutdown): Started shutdown process
2017-09-25 23:15:31 +0900 [INFO] (shutdown): Shutting down workflow executor loop
2017-09-25 23:15:31 +0900 [INFO] (shutdown): Closing HTTP listening sockets
2017-09-25 23:15:31 +0900 [INFO] (shutdown): Waiting for completion of running HTTP requests...
2017-09-25 23:15:31 +0900 [INFO] (shutdown): Shutting down HTTP worker threads
2017-09-25 23:15:31 +0900 [INFO] (shutdown): Shutting down system
2017-09-25 23:15:31 +0900 [INFO] (shutdown): Shutdown completed

結論

今回紹介した通り環境によって値が変わる時は、下記のようにすると良いと思う。

  1. 環境毎にパラメータのymlファイルを作成
  2. タスクの実行、もしくはサーバ起動時にパラメータファイル(--params-file もしくは -P)を指定

Ansibleなどを利用している場合は各環境に合わせて、digdagサーバを実行する際の --params-file もしくは -P を設定すれば良いということになる。

お役に立てたら何よりですm(_ _)m

© szyn 2017