Kompira

Menu Menu

Enterprise Technical information

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

Kompiraのジョブフローはssh接続した上でのシェルコマンド実行や、メールの送受信など、運用フローを考える上で頻出する処理が書きやすいように作られています。しかし、実際の運用現場で行われる処理は多様です。ExcelやCSVファイルを読み書きしたい場面があるかもしれません。MySQLやOracle DBなど、RDBMSにアクセスしたいこともあるでしょう。 このようにKompiraの標準機能として用意されていない要素を扱いたい場合は、Pythonのプログラムで機能を実装し、それをKompiraのジョブフローから呼び出す、という方法があります。 本記事ではPythonの言語仕様の詳細には触れず、若干の基礎知識は持っている前提です。必要に応じて専門書やサイトなどを参照してください。   環境情報 本記事は、以下の環境で検証しております。  
項目 バージョン
OS CentOS Linux release 7.7.1908
Kompira ver.1.5.5.post8
mysql-connector-python 8.0.20
  ※ 上記バージョンのKompiraのライブラリオブジェクトとして記述できるのは、バージョン2系の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の標準ライブラリでは文字列処理の関数はあまり多くありませんが、split()以外にもfind()などの文字列検索や、reモジュールを呼び出して正規表現によるパターン検索なども行えます。 ここで注意が必要なのが外部pipモジュールのインストール方法です。例えば、MySQLのドライバを利用する例では mysql-connector-python というpipモジュールが必要となります。必要なモジュールがKompiraの環境にないと、ライブラリオブジェクトは以下のようなエラーを出します。   ライブラリオブジェクト_エラー これを解消するためにはKompiraサーバにおいて以下のコマンドを実行し、Kompiraの環境において mysql-connector-python をインストールする必要があります(管理者権限が必要です)。  
$ /opt/kompira/bin/pip install mysql-connector-python
  インストールが完了したら、ライブラリオブジェクトを「編集」→「保存」すると実行できるようになります。 また、引数の与え方にも注意する必要があります。Kompiraの外部ジョブフローを呼び出すときのように”:”の後に記載するか、()の中に指定して変数に代入します。単に()の中に指定しただけで変数に代入しないと、ライブラリ呼び出しの結果 (ここでは「100」) をジョブとして実行してしまうため、エラーとなります。   NGの例  
[./extlib.salestax: 1000] ->
print($RESULT) ->
[res = ./extlib.salestax(1000)] ->
print(res) ->
[./extlib.salestax(1000)] ->  # エラー
print($RESULT)
  このようにKompira本体の機能で不足する場合は、Pythonの豊富な機能を利用する事が出来ます。特に外部システムと連携したいとき、Pythonライブラリが提供されている場合には積極的に利用してみましょう。

スタートガイド

Kompiraジョブフローの基礎

ジョブフローの簡単な例

Kompiraの機能

外部との連携