2021年10月12日火曜日

adnanh webhook を使ってコマンドを実行する方法

adnanh webhook を使ってコマンドを実行する方法

概要

過去にshell2http というツールを使って HTTP からコマンドを発行する方法を紹介しました

今回紹介する adnanh/webhook は更に柔軟にコマンドを発行することができます
インストールから簡単な使い方を紹介します

環境

  • Ubuntu 18.04
  • webhook 2.5.0

インストール

今回は Ubuntu なので apt を使います

  • apt-get -y install webhook

go で書かれているので go get したり自分でビルドしても OK です
apt でインストールすると自動で sysetmd 配下に登録してくれます

実行するシェルの作成

今回は簡単なシェルを作成します
現在の日付をファイルに出力するだけのスクリプトになります

#!/bin/bash
date > /tmp/result_test_shell.log

hooks.json の作成

hooks.json は webhook で使用する設定ファイルです
実行するスクリプト名や各種オプションを設定します
YAML 形式でも記載できます

  • cd /tmp
  • vim hooks.json
[
  {
    "id": "test-webhook",
    "execute-command": "/tmp/test.sh",
    "command-working-directory": "/tmp"
  }
]

複数の定義を記載することができます
id の部分は webhook でリクエストする際の URI のパス名になります

webhook の起動

では起動します
成功すると :9000 ポートで起動します

  • webhook -hooks /tmp/hooks.json -verbose

-verbose を付与するとログが表示されます
systemd がすでに起動している可能性もあるのでその場合は systemd 側を停止してから起動しましょう

  • systemctl stop webhook
  • systemctl disable webhook

動作確認

あとは curl で動作してみましょう
パラメータがない場合は GET でも POST でも OK です

  • curl localhost:9000/hooks/test-webhook
  • cat /tmp/result_test_shell.log

実行後にちゃんとファイルが生成されて日付が記載されていることを確認しましょう

パラメータを付与してスクリプトを実行する方法

webhook 時に application/json で渡したデータをスクリプト内で使用することもできます

#!/bin/bash
echo $MSG > result_test2_shell.log

MSG という変数に webhook で渡ってきたデータを格納してみます

パラメータのマッピングを定義する

webhook から送信された JSON 情報を変数に格納するマッピング情報を新たに定義します
使用するオプションは pass-environment-to-command になります

  • vim hooks2.json
[
  {
    "id": "test-webhook2",
    "execute-command": "/tmp/test2.sh",
    "command-working-directory": "/tmp",
    "include-command-output-in-response": true,
    "pass-environment-to-command":
    [
      {
        "envname": "MSG",
        "source": "payload",
        "name": "message"
      }
    ]
  }
]

source の payload は送られて来た JSON をパースすることを明示しています
JSON を使う場合は必須なのでそのまま記載します

そして JSON の message として送られてきたデータを変数 MSG に格納します
name がパース対象のフィールド名で envname が格納する変数名になります

動作確認

  • webhook -hooks /tmp/hooks2.json -verbose

ではデータを送信してみます
今度は POST で application/json のデータを送信するようにリクエストを変更します

  • curl -XPOST -H 'Content-type: application/json' -d '{"message":"HELLO"}' localhost:9000/hooks/test-webhook2

これでファイルを確認すると「HELLO」と記載されているのが確認できると思います

最後に

webhook を送信するサービスはいろいろとありますがそれを受け取る場合に自分で作成する必要がありました

adnanh/webhook を使えばどんなサービスの webhook でも受けられるように汎用的に作られているので便利です

他にも XML を受け取ったりファイル、マルチパートデータを受け取ったりできるので基本な HTTP リクエストには対応しているかなと思います

参考サイト

0 件のコメント:

コメントを投稿