こんにちは。
先日に Laravel で作った Ansible の管理ツールですが、プロビジョニング時に通知を行う機能が欲しいなー、と。
Slack でもよいのですが、会社で主に使っている Chatwork に通知してみます。
事前準備
Chatwork の API トークンが必要です。
https://developer.chatwork.com/ja/
環境変数(.env)から API トークンと、通知先エンドポイントを読めるようにしておきます。
config/chatwork.php ========================================== <?php # Chatworkのtokenを環境変数から取得 return [ 'cw-token' => env('CW_TOKEN'), 'cw-endpoint' => env('CW_ENDPOINT'), ];
メソッド
Laravel では Guzzle HTTP クライアントで簡単に http リクエストを発行できるようです。
ヘッダに API トークン、ボディに通知内容のメッセージを指定するんですが、URL エンコードする必要があるので、リクエストを作成する前に asForm メソッドを呼び出します。
※プロビジョニング実行時、完了時で合計 2 つのメソッドを作成します。
use Illuminate\Support\Facades\Http; /** * 実行時 Chatwork 通知メソッド */ public static function notify2ChatworkStart($user){ $token = config('chatwork.cw-token'); $endpoint = config('chatwork.cw-endpoint'); $date = date("Y/m/d H:i:s"); $message = "[info][title]EASE Ansible MG started provisioning at " . $date . "[/title]\n" . " by " . $user->name . "[/info]"; $response = Http::asForm()->withHeaders([ 'X-ChatWorkToken' => $token, ])->post($endpoint, [ 'body' => $message ]); return $response; } /** * 終了時 Chatwork 通知メソッド */ public static function notify2ChatworkEnd($ansible_output){ $token = config('chatwork.cw-token'); $endpoint = config('chatwork.cw-endpoint'); $date = date("Y/m/d H:i:s"); $message = "[info][title]EASE Ansible MG ended provisioning at " . $date . "[/title]\n" . $ansible_output . "[/info]"; $response = Http::asForm()->withHeaders([ 'X-ChatWorkToken' => $token, ])->post($endpoint, [ 'body' => $message ]); return $response; }
使い方
環境変数が設定されている時にメソッドを呼び出すだけです。
とてもお手軽。
# Chatworkへの通知(実行時) if (config('chatwork.cw-token')){ Playbook::notify2ChatworkStart($user); }; # Chatworkへの通知(完了時) if (config('chatwork.cw-token')){ Playbook::notify2ChatworkEnd($ansible_output[count($ansible_output)-2]); };