Python で記述された処理を Kompira Enterprise から呼び出す

Kompira Enterprise のジョブフローは、ssh 接続した上でのシェルコマンド実行や、メールの送受信など、運用フローを考える上で頻出する処理が書きやすいように作られています。しかし、実際の運用現場で行われる処理は多様です。Excel や CSV ファイルを読み書きしたい場面があるかもしれません。MySQL や Oracle DB など、RDBMS にアクセスしたいこともあるでしょう。

このように Kompira Enterprise の標準機能として用意されていない要素を扱いたい場合は、Python のプログラムで機能を実装し、それを Kompira Enterprise のジョブフローから呼び出す、という方法があります。

本稿では Python の言語仕様の詳細には触れません。必要に応じて専門書やサイトなどを参照してください。


動作確認環境

本稿は、以下の環境で検証しております。

ソフトウェア バージョン
Kompira Enterprise 1.5.5.post11
OS CentOS 7.8.2003
mysql-connector-python 8.0.25

または

ソフトウェア バージョン
Kompira Enterprise 1.6.2.post4
OS CentOS 8.2.2004
mysql-connector-python 8.0.25

または

ソフトウェア バージョン
Kompira Enterprise 1.6.8
OS CentOS Stream 8
mysql-connector-python 8.0.29

※ Kompira Enterprise 1.5系のライブラリオブジェクトとして記述できるのは、バージョン2系の Python スクリプトのみでしたが、Kompira Enterprise 1.6系ではバージョン3系の Python スクリプトのみとなりました。本稿の Python スクリプトはどちらのバージョンでも実行可能です。


Python プログラムについて

Python の構文として、ここでは def と import の2つについて簡単に説明をします。
まず def は、Python で関数を定義するための構文です。

def salestax(x):
    rate = 0.1
    return x * rate

これは消費税額を計算する単純なスクリプトです。ここでは def 文を用いて関数 salestax() を定義しています。salestax() を利用して税込価格 (priceincludingtax) を計算するには次のようにします。

price = 1000
priceincludingtax = price + salestax(price)

次に、import は Python ライブラリの読み込みを行うための構文です。
Python には標準、サードパーティー含め、豊富なライブラリが用意されています。特にデータ加工や、外部システムと通信するための API ライブラリが Python で提供されているケースも多くみられます。

ここでは MySQL のドライバ  mysql-connector-python を利用し、レコードを追加する例を説明します。

MySQL のドライバを使用してレコードを追加する例

import mysql.connector as mydb

conn = mydb.connect(
    host='localhost',
    port='3306',
    user='user',
    password='password',
    database='kompiradb'
)
curs = conn.cursor()

sql = u"insert into test_table values(1, 'kompira')"
curs.execute(sql)

sql = u"insert into test_table values(2, 'こんぴら')"
curs.execute(sql)

conn.commit()
curs.close()
conn.close()

ジョブフローから Python スクリプトを呼び出す

まずは「ライブラリ」オブジェクトを作成します。ここでは「extlib」という名前で作成します。

編集画面で以下のスクリプトを記述して保存します。split() は、文字列を単語に分解する Python の関数です。

ライブラリ「extlib」

def split(x):
    return x.split()

def salestax(x):
    rate = 0.1
    return x * rate

結果、以下のような画面になります。ここで「FUNCTIONS」の欄に salestax(x) と split(x) が表示されています。これがジョブフローから利用できる関数になります。

それでは上で定義した関数を利用してみましょう。
ここでは新しくジョブフロー「ライブラリ利用」を作成してみます。

ジョブフロー「ライブラリ利用」

# 消費税額の計算
[./extlib.salestax: 1000] ->
print($RESULT) ->

# 単語分割
[./extlib.split: "hello world"] ->
print($RESULT)

これを実行すると以下のような結果が得られます。

100.0
['hello', 'world']

Kompira Enterprise の標準ライブラリでは文字列処理の関数はあまり多くありませんが、split() 以外にも find() などの文字列検索や、re モジュールを呼び出して正規表現によるパターン検索なども行えます。

ここで注意が必要なのが外部 Python ライブラリのインストール方法です。例えば、MySQL のドライバを利用する例では mysql-connector-python という Python ライブラリが必要となります。必要な Python ライブラリが Kompira Enterprise の環境にないと、ライブラリオブジェクトは以下のようなエラーを出します。

これを解消するためには Kompira Enterprise サーバにおいて以下のコマンドを実行し、mysql-connector-python をインストールする必要があります。(管理者権限が必要)

$ /opt/kompira/bin/pip install mysql-connector-python

インストールが完了したら、ライブラリオブジェクトを「編集」→「保存」することで実行できるようになります。

また、引数の与え方にも注意する必要があります。Kompira Enterprise の外部ジョブフローを呼び出すときのように、 “:” の後に記載するか、() の中に指定して変数に代入する必要があります。単に () の中に指定しただけで変数に代入しないと、ライブラリ呼び出しの結果である100.0をジョブとして実行してしまうため、エラーとなります。

NG 例

[./extlib.salestax: 1000] ->
print($RESULT) ->  # 100.0

[res = ./extlib.salestax(1000)] ->
print(res) -> # 100.0

[./extlib.salestax(1000)] ->  # エラー。[100.0] と同義
print($RESULT)

このように Kompira Enterprise 本体で不足する機能については、Python の豊富な機能を利用することで解決できます。特に外部システムと連携したいとき、Python ライブラリが提供されている場合には積極的に利用してみましょう。

TOP