ジョブフローの書き方FAQ(その2)

ジョブフローの書き方 FAQ (その1) に続いて、ジョブフローの書き方に関する FAQ をご紹介します。


動作確認環境

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

または

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

(1) オブジェクト名の命名規則は?

命名時のルールとしては次のようなものがあります。

・アルファベット、数字、半角アンダーバー (“_”) 、日本語を使うことができる。
・先頭の文字は半角数字以外でなければいけない。
・アルファベットの大文字と小文字は区別される。
・オブジェクトの名称の長さは128文字以内でなければいけない。
・絶対パスの長さは1024文字以内でなければいけない。

以下に具体例を示します。

オブジェクト名 有効かどうか 備考
AAA (半角) OK
_AAA (半角) OK
111 (半角) NG 半角数字で始まるためNG
AA-B (半角) NG ハイフンが含まれるためNG
AAA (全角) OK
111 (全角) OK 数字から始まるが、全角文字のためOK
いろは (全角) OK
*A (全角) NG
-A (全角) NG
_A (全角) NG

「- (ハイフン)」が使用できないことに注意してください。
また、全角の数字については先頭であっても使用できますが、全角の記号を名前に含めることはできません。

(2) 状態変数を文字列の中に埋め込みたい

Kompira Enterprise では、文字列の中に $ 付きで変数名を記述すると、ジョブフロー中に定義されている変数の値に置換して文字列とする機能があります。

[x = "hello"] ->
print("$x, world")    # "hello, world"

これとは別に Kompira Enterprise では各命令の結果を格納する $RESULT、$STATUS、$ERROR、$DEBUG という変数が存在し、これらを「状態変数」と呼んでいます。
これらは変数名自体に「$」が入っているので、”$RESULT” と書いただけでは文字列の中で値を展開させることができません。

この場合、 “${$RESULT}” のように、{ } で囲むように記述することで値を展開させることができます。

["pwd"] ->
print("Status: $STATUS Path: $RESULT") ->      # このまま表示される

# pwd に対する $STATUS、$RESULT の値が埋め込まれた文字列が表示される
print("Status: ${$STATUS} Path: ${$RESULT}")  

(3) 変数で扱える数について

Kompira Enterprise 1.6系では、変数として小数を扱うことができます。

※ なお、Kompira Enterprise 1.5系では小数は扱えません。

[pi = 3.14]

システム運用目的のジョブフローの場合、小数を扱うケースはあまりありませんが、例えば構成管理でミドルウェアのバージョン番号などを保存しておきたい時に役立ちます。

(4) ssh コマンド実行時の状態について

Kompira Enterprise では [“コマンド”] という構文を使用することで、ローカル/リモートサーバー上でコマンドを実行させることができます。

このとき、[“コマンド”] はそれぞれ個別に通信が発生して実行されます。よって、前の [ ] の処理で実行した一時的な設定は、次の [] に引継ぐことができません。
具体的には、ディレクトリの変更を行う cd コマンドや、環境変数の export コマンドの結果などが引き継がれません。

環境変数の変更を伴うジョブフロー例

# システムのデフォルト言語設定が日本語と想定
# 環境変数の設定が必要な場合の例(英語表記)
["export LANG=C; date"] ->
    
# 直前の環境変数は引き継がれずに日本語表記される
["date"]

この結果は以下のように、 export した1行目のみが英語表記になります。

※ Kompira Enterprise 1.6系では、print しなくとも実行したコマンドの結果が出力されます。

Wed Jun  2 12:07:27 JST 2021
2021年  6月  2日 水曜日 12:07:27 JST

UNIX / Linux が対象の場合は、上記の [“export LANG=C; date”] のように “;” を使って処理を連続させることで設定を引き継ぐことができます。

また、cd を行いたい場合は、__dir__ 制御変数を使用することでコマンド実行時のワーキングディレクトリを指定することができます。

より長い手順を実行する必要がある場合は、スクリプトジョブ型オブジェクトを使用してスクリプトにより処理を実行するようにする、もしくは session ブロックを利用するといった方法があります。詳しくはそれぞれ「既存のスクリプトを Kompira Enterprise で利用する」「Kompira Enterprise のセッション機能を利用して対話的にコマンドを実行する」を参照してください。

(5) 外部コマンド結果の受信タイミングについて

Kompira Enterprise 1.6系では [“コマンド”] 構文を使用してコマンド実行を行う場合、出力が逐次表示されます。

※ なお、Kompira Enterprise 1.5系ではコマンドが終了したタイミングですべての結果を取得します。

また、手動で Ctrl + C (SIGINT シグナルの送信) をすることで停止することが想定されているようなコマンドは、停止させることができません。(tail -f、top など)
この場合、コマンドのオプションで停止するような動作にできるかどうかを調べてみてください。

["vmstat 1 30"]       # 仮想メモリの情報を1秒ごとに30回表示するコマンド

上記例の “vmstat 1 30” は、シェルログインしたコンソールや Kompira Enterprise 1.6系で実行すると1秒ごとに表示が追加されます。Kompira Enterprise 1.5系では30回の結果表示が完了し、コマンド自体が終了したタイミングですべての結果を取得します。

(6) 文字列の指定に使用する ‘ と ” は何か違いがあるか?

特にありません。どちらも対になる記号を入れて利用します。’ や ” の文字を文章中に含めたい場合には、それとは別の記号を引用符として使うことで扱えるようになります。

print("hello ' world") -> # hello ' world 
print('hello " world') # hello " world

(7) 配列や辞書の要素を削除したい

del_item メソッドを使用することで、配列および辞書の要素の削除をすることができます。

del_item の使用例

[arr = ['a', 'b', 'c', 'd']] ->
print(arr) ->              

[arr.del_item: 1] ->       # 1番目の要素 "b" を削除
print(arr) ->              # ['a', 'c', 'd']

[dict = {'key1': 'a', 'key2': 'b', 'key3': 'c'}] ->
print(dict) ->
          
[dict.del_item: "key2"] -> # "key2" の要素を削除
print(dict)                # {'key1': 'a', 'key3': 'c'}

また、辞書に対しては pop_item というメソッドを使用することができます。
pop_item は、指定されたキーを辞書から削除し、値を $RESULT に格納します。また、キーが存在しない場合のデフォルト値もあわせて指定することができます。

pop_item の使用例

[dict = {'key1': 'a', 'key2': 'b', 'key3': 'c'}] ->
print(dict) ->                     

# 'key2' の要素を削除し、$RESULT に格納する
[dict.pop_item: "key2", "X"] ->    
print($RESULT) ->                  # 'b' 
print(dict) ->                     # {'key1': 'a', 'key3': 'c'}

[dict.pop_item: "key999", "X"] ->  # 存在しないキーの指定
print($RESULT)                     # 'X'
TOP