チャネルを利用して外部システムからデータを受信する

メール受信をトリガーにしてジョブフローを実行する」では、Kompira Enterprise でメールを利用する方法をご説明しました。
本稿では Kompira Enterprise の「チャネル」を用いて、外部システムから Kompira Enterprise に情報を送信する方法をご紹介します。

「メールチャネル」では外部のメールサーバーに対してポーリングをかけ、メールサーバーからメールを受信する動作をしますが、「チャネル」は外部からデータが送られてくるのを待機するという動きになります。「チャネル」にデータを送るのは専用のツール「kompira_sendevt」を用います。


動作確認環境

ソフトウェア バージョン
Kompira Enterprise 1.5.5.post11
OS CentOS 7.8.2003

Windows 10 21H1

Python 2.7.18

または

ソフトウェア バージョン
Kompira Enterprise 1.6.2.post4
OS CentOS 7.8.2003

Windows 10 21H1

Python 3.6.8

Linux への kompira_sendevt インストール

まずはデータを送信するためのツールを用意します。次のようなコマンドで必要なモジュールをインストールします。

$ wget https://bitbucket.org/kompira/package/downloads/kompira-<version>-bin.tar.gz
$ tar zxvf kompira-<version>-bin.tar.gz
$ cd kompira-<version>-bin
$ sudo ./install.sh --sendevt <Kompira Enterprise サーバー名>

<version> は Kompira Enterprise のバージョン (例えば1.6.2.post4) を、
<Kompira Enterprise サーバー名> は Kompira Enterprise サーバーのホスト名、または IP アドレスを指定します。

※ 通知先の Kompira Enterprise と同一バージョンのパッケージを使ってインストールすることを推奨します

以上で、イベント送信パッケージのインストールは完了です。/opt/kompira/bin 以下に kompira_sendevt コマンドが配置されます。

以下のようにターミナル上で kompira_sendevt コマンドを実行してバージョン番号が表示されることを確認してください。

$ /opt/kompira/bin/kompira_sendevt --version

必要に応じてパスを通す設定を行ってください。

Windows への kompira_sendevt インストール

Windows では動作のために Python の動作環境が必要となります。

Python のインストール

以下の公式ダウンロードサイトから、通知先の Kompira Enterprise のバージョンに対応した Python をウンロードして、 Windows にインストールしてください。

https://www.python.org/downloads/windows

Kompira Enterprise 1.6 系の場合は  Python 3.6 系、Kompira Enterprise 1.5 系の場合は Python 2.7系 になります。

※ 指定したバージョン以外の Python では正常に作動しない可能性があります。

インストールが完了したら、コマンドラインから Python が起動できるように、環境変数のパスを追加してください。

kompira_sendevt パッケージのインストール

Kompira Enterprise パッケージを Windows 上にダウンロードして展開し、展開したディレクトリの /kompira-<version>-bin/dist/ に移動してから、以下のコマンドを実行します。

$ pip install Kompira_sendevt-<version>-py3-none-any.whl

※ <version> は Kompira Enterprise のバージョンに合わせて適宜置き換えてください。

※ Kompira Enterprise 1.5 系の場合は Kompira_sendevt-<version>-py2-none-any.whl になります。

以上で、イベント送信パッケージのインストールは完了です。以下のように Windows のコマンドコンソールで kompira_sendevt コマンドを実行してバージョン番号が表示されることを確認してください。

$ kompira_sendevt --version

ジョブフローでチャネルを扱う

ここまででデータの送信側の設定を行ってきましたが、今度は受信側のジョブフローを実装していきます。ここでは Kompira Enterprise のデフォルトのチャネル /system/channels/Alert を利用して、下記のようなジョブフローを実行します。

</system/channels/Alert> -> # データの受信待機
[message = $RESULT] -> # データを受信したら内容は $RESULT に格納される
print('${message} を受信しました') ->
self() # 再度、受信待機に戻る

上記のジョブフローを実行しますと、実行画面の右側の「プロセス情報」のステータスは「待ち」状態になり、コンソールには実行中の表示と、データを受信した際には受信したメッセージが表示されます。停止させる際には「停止」ボタンを利用してください。

次に kompira_sendevt コマンドをインストールしたサーバーからデータを送信します。次のようなコマンドを実行してみてください。

$ /opt/kompira/bin/kompira_sendevt -s <Kompira Enterprise サーバー名> key=msg

※ Windows 環境の場合は /opt/kompira/bin/kompira_sendevt を kompira_sendevt に置き換えてください

数秒後に Kompira Enterprise のコンソールには以下のような表示が現れます。

{'key': 'msg'} を受信しました

上記のように「key=msg」というデータを送信すると、{ } でくくられた key-value 関係の辞書型のデータとして格納されます。また、この値は複数を送ることが出来ます。

次にデータをコマンドラインのパイプを使って送り込んでみます。

$ cd /opt/kompira/bin
$ pwd | ./kompira_sendevt -s <Kompira Enterprise サーバー名>

するとコンソールの表示は以下のようになります。

b'/opt/kompira/bin\n'を受信しました

このように、パイプで送られたデータの場合には辞書型ではなく、バイナリ型のリテラルとして受信します。

※ Kompira Enterprise 1.5 系以前では文字列として受信します。

「処理のトリガーとなるようなメッセージを送信する場合にはコマンドラインから送信する」「コマンドの出力結果などを送る場合にはパイプを利用する」といった使い分けをしてみてください。

チャネルで受信したデータにより、ジョブフローを起動するには、例えば下記のようにジョブフローを修正します。

</system/channels/Alert> -> # データの受信待機
[message = $RESULT] -> # データを受信したら内容は $RESULT に格納される
print('${message} を受信しました') ->
{ if message.title == "DOWN" |
    [./プロセス再起動: message.server]
} ->
self() # 再度、受信待機に戻る

上記のジョブフロー起動後、

$ /opt/kompira/bin/kompira_sendevt -s <Kompira Enterprise サーバー名> title=DOWN server=server1

というようにデータを送信すると、[./プロセス再起動] というジョブフローが実行されることになります。ここでは [./プロセス再起動] が、再起動の対象となるサーバー名を引数にとることを想定しています。

独自のチャネルを作成する

ここまでは Kompira Enterprise のデフォルトで用意されたチャネル「Alert」を利用してきましたが、これだけでは様々な機器や条件で受信したデータを振り分ける際に不便です。

そのため、独自のチャネルを用意する方法をご紹介します。

方法は非常に簡単で、ジョブフローを作成するのと同様に、名前を指定し、型を「チャネル」にしてオブジェクトを作成するだけです。

このチャネルを利用して先のジョブフローを書き換えると以下のようになります。

<./テストチャネル> -> # データの受信待機
[message = $RESULT] -> # データを受信したら内容は $RESULT に格納される
print('${message} を受信しました') ->
{ if message.title == "DOWN" |
    [./プロセス再起動: message.server]
} ->
self() # 再度、受信待機に戻る

このジョブフローはデフォルトの Alert チャネルを用いた場合と機能的には差がありません。ただし、データを送る側では明示的にチャネルを指定する必要があります。

例えば /root/receive_inbound_data にテストチャネルを作成した場合は以下のように指定します。

$ /opt/kompira/bin/kompira_sendevt -s <Kompira Enterprise サーバー名> --channel=/root/receive_inbound_data/テストチャネル title=DOWN server=server1

同一のチャネルを複数のジョブフローから利用することも可能ですが、その際には最初に処理したジョブフローだけがメッセージを処理することになります。

このためジョブフローの用途に応じて、送信側のサーバーごと、または発生させるイベント種別ごとにチャネルを作成すると、受信データの扱いが楽になり思わぬ事故を防ぐことができます。

チャネル自体は、それを利用するジョブフローの有無や、ジョブフローが動作中 / 停止中などの状態に関係なくデータを受信します。また受信したデータは内部的にはメッセージキューに格納され、受信順に FIFO (First-in-First-out) で処理されます。

このように外部のサーバーから Kompira Enterprise にデータを送る手段をご用意してありますので、運用ツールと連携させたり、スクリプトから呼び出して、Kompira Enterprise 上のジョブフローを制御してみてください。

TOP