Kompira

Menu Menu

Enterprise Technical information

Kompiraジョブフローの基礎 Kompiraのセッション機能を利用して対話的にコマンドを実行する

動作確認環境

 

ソフトウェア バージョン
Kompira 1.5.5.post7
LinuxOS CentOS7.8.2003

 


Kompiraでサーバー等でコマンドを実行する際には[“コマンド”]というように[ ]で囲みます。この場合、複数の[ ]内のコマンドは別のセッションとして実行されます。例えば次の様なジョブフローを見てみましょう。

 

["date"] -> print($RESULT) ->
["export LANG=C; date"] -> print($RESULT) ->
["date"] -> print($RESULT)

 

この実行結果は例えば次の様になります。

 

[test.fastcoding.jp] local: date

2017年  2月 12日 日曜日 08:58:06 JST
[test.fastcoding.jp] local: export LANG=C; date

Sun Feb 12 08:58:06 JST 2017
[test.fastcoding.jp] local: date

2017年  2月 12日 日曜日 08:58:06 JST

 

dateコマンドの出力がロケールを明示的にCロケールに変更した2行目だけ英語になっているのがお分かりになると思います。また2行目で設定したロケールが3行目のdateコマンドを実行する際に引き継がれておらず、改めて日本語出力になっています。つまり各行がそれぞれ別のセッションとして実行されています。
コマンドの実行の都合上、同一セッションで行わなければならない局面では、sessionブロックを利用して記述します。

 

sessionブロック

sessionブロックは以下のような形式で記述します。

 

{ session (セッションチャネル名) |
  (ジョブフロー)
}

 

[“コマンド”]の場合の実行結果は$RESULT変数に格納されますが、セッションの途中の状態では接続先のリモートサーバーとのやり取りをセッションチャネルを通じて行います。またセッションブロック終了時、$RESULTにはセッションチャネルが格納され、date属性に未読み込みのデータが格納された状態になります。またセッションが成功した場合にはセッションブロック終了後に$STATUSに0が格納されます。

たとえば、上記と同じように実行するには次の様になります。

 

[__node__= ./接続先サーバ] ->
{ session s |
  [s.send: "date\n"] ->
  <s> -> print($RESULT) ->
  [s.send: "export LANG=C; date\n"] ->
  <s> -> print($RESULT) ->
  [s.send: "date\n"] ->
  <s> -> print($RESULT)
} =>
{ if $STATUS==0 |
 then: [response=$RESULT.data] -> print(response) -> print("セッションが正常に終了しました。")
 else: print("セッション中に異常が発生しました。")
}

 

この場合の実験結果は、例えば次の様になります。

 

[13.78.115.192] session: 2017年  2月 12日 日曜日 09:43:38 JST
2017年  2月 12日 日曜日 09:43:38 JST

[13.78.115.192] session: Sun Feb 12 09:43:38 JST 2017
Sun Feb 12 09:43:38 JST 2017

[13.78.115.192] session: Sun Feb 12 09:43:38 JST 2017
Sun Feb 12 09:43:38 JST 2017

セッションが正常に終了しました。

 

[“コマンド”]の場合とは異なり、ジョブフロー中の2回目のdateコマンドの直前に設定されたLANGが3回目のdateコマンドの実行時にも有効になっているのが見て取れると思います。

 

接続先サーバーとの対話

コマンドを実行した結果に応じてコマンドを投入したい場合は、セッションチャネルでガード式を利用して指定した応答を待ちます。上記の例ではセッションの値を拾う際に<s>としていますが、ここを <s ?? g”*]$ “> のように書きます。この場合、メッセージキューの先頭から順にオブジェクトがマッチするかどうかを調べ、マッチした場合には、それまでのオブジェクトを破棄して、マッチしたオブジェクトを受信します。
ここでは

 

[user@server log]$

 

のようなシェルログインした場合のプロンプトが返ってくるのを待ちます。応答が指定のパターンにマッチした場合に次の処理に進みます。

 

g"*]$ "

 

の部分は、globのパターンリテラルを使用しており、”(任意文字列)]$ “で上記のプロンプトにマッチさせるようにしています。

ジョブフローにすると、例えば以下のようになります。

 

[__node__= ./接続先サーバ,__use_pty__=true] ->
{ session s |
  [s.send: "export LANG=ja_JP.UTF-8 ; date\n"] ->
  <s ?? g"*]$ "> -> print($RESULT) ->
  [s.send: "export LANG=C ; date\n"] ->
  <s ?? g"*]$ "> -> print($RESULT) ->
  [s.send: "date\n"] ->
  <s ?? g"*]$ "> -> print($RESULT) ->
  [s.send: "export LANG=ja_JP.UTF-8 ; date\n"] ->
  <s ?? g"*]$ "> -> print($RESULT)
} =>
{ if $STATUS==0 |
  then: 
    [response = $RESULT.data] ->
    print(response) ->
    print("セッションが正常に終了しました。")
  else:
    print("セッション中に異常が発生しました。")
}

 

実行結果は次の様になります。

 

[192.168.1.1] session: export LANG=ja_JP.UTF-8 ; date
[192.168.1.1] session: [user@server ~]$ export LANG=ja_JP.UTF-8 ; date
[192.168.1.1] session: 2017年  2月 12日 日曜日 00:54:02 JST
[user@server ~]$ 
[192.168.1.1] session: [user@server ~]$ export LANG=C ; date
[192.168.1.1] session: Sun Feb 12 00:54:02 JST 2017
[user@server ~]$ 
[192.168.1.1] session: [user@server ~]$ date
[192.168.1.1] session: Sun Feb 12 00:54:02 JST 2017
[user@server ~]$ 
[192.168.1.1] session: [user@server ~]$ export LANG=ja_JP.UTF-8 ; date
[192.168.1.1] session: 2017年  2月 12日 日曜日 00:54:02 JST
[user@server ~]$ 

セッションが正常に終了しました。

 

上記の例では通常のシェルログインをした際のプロンプトを想定したマッチングパターンを利用していますが、例えばsuコマンドでパスワード待ちを行わせるような場合には、

 

 

のようにして、パスワード入力のプロンプトを待って、パスワード文字列を入力をさせる事が出来ます。

スタートガイド

Kompiraジョブフローの基礎

ジョブフローの簡単な例

Kompiraの機能

外部との連携