本稿では、Kompiraの主要機能であるジョブフロー言語について、基礎文法最速マスターフォーマットに則ってご紹介します。
このジョブフロー言語は『運用手順書を自動化する』ことを目的としており、手順書の手続きが簡潔に書きやすいようにという観点で設計されています。
※本記事はKompira ver1.3.2の仕様に基づき記述しています。今後のアップデートにより、以下の内容は変更されることがあります。
0. 動作環境
KompiraはLinux(現在はCentOSのみサポート)上で動作するアプリケーションであり、Webブラウザからアクセスすることが可能です。1. 基礎
Hello World
print関数を使うことで、文字列をコンソールに出力することができます。カンマで区切って複数一度に出力させることも可能です。
print('Hello World!') -> print('hoge', 'fuga', 'moge')
コメント
1行コメントです。#から行末までがコメントアウトされます。# コメント # print('hoge')
変数の宣言
変数の宣言はなく、変数に代入する型も制限されません。[ a = 1 ] -> [ b = 3, c = 'hoge' ]
命令の接続
「->」でコマンドをつなぐと、前のコマンドが成功したら後続のコマンドを実行するという意味になります。[ a = 1 ] -> [ b = 2 ] -> print(a) -> print(b)「->」の場合、前のコマンドが失敗するとその時点でプログラムの実行を終了します。
失敗しても処理を継続させたい場合は「=>」を使用します。
プログラムの実行
WebブラウザからKompiraにアクセスして、プログラムを作成・編集・実行させることができます。上記画面で実行ボタンを押すとプロセスが生成され、プロセス単位でプログラムの実行状態を確認することができます。
2. 基本的な型、データ構造
数値
数値は整数値のみをサポートしています。[num = 0] -> [num = 1 + 2] -> # 3 [num = 8 - 1] -> # 7 [num = 2 * 3] -> # 6 [num = 5 / 2] -> # 2 [num = 10 % 3] # 1
文字列
文字列はシングルクォートもしくはダブルクォートで囲みます。シングルクォート3つかダブルクォート3つで囲むと、複数行にわたる文字列となります。
[str1 = 'abc'] -> [str2 = "kompira"] -> [multiline_str = """Hello World"""]$を使用することで、以下の様な変数展開を行なうことができます。
[name = "kompira"] -> [str = "hello, ${name}"] -> print(str) # 'hello, kompira'文字列結合
[str = "abc" + "xyz"] # "abcxyz"
リスト
リストは「[]」を使います。[list = [1, 'foo', ['nested'], 4, 5]] -> print(list[0]) -> # 1 print(list[2][0]) -> # 'nested' [2 >> list[1]] # listの1番目の要素を2に変更
辞書
辞書は「{}」を使います。[dic = {foo='abc', bar=123, baz=[1,2,3]}] -> print(dic['foo']) -> # 'abc' print(dic['baz'][2]) -> # 3 ['text' >> dic['foo']] # dic['foo']の値を'text'に変更
3. 制御構文
ifブロック
条件文ではnull, 0, 空文字列, falseは偽とみなされます。{ if x == 0 | then: print('xの値は0') elif x == 1: print('xの値は1') elif x > 1: print('xの値は1より大きい') else: print('xは負の値') }elif, else節を省略した以下の記法も有効です。
{ if x == 0 | print('xの値は0') }
caseブロック
{ case str | 'hello': print('hello world') 'bye': print('bye.') else: print('unknown') }
forブロック
[arr = [1,2,3,4,5]] -> { for x in arr | print(x) }
whileブロック
[ x = 0 ] -> { while true | { if x < 5 | print(x) -> [ x = x+1 ] -> continue } -> break } -> print('OK')
4. シェルコマンドの実行
ローカルコマンドの実行
「[]」の中に文字列を入れることで、Kompiraがインストールされているローカルマシン上でシェルコマンドを実行します。['echo hello world'] -> print($RESULT) # 'hello world'コマンドを実行した結果、ステータスコードが0以外だった場合は失敗となり、ジョブフロープロセスは終了します。 ステータスコードが0以外でも処理を継続させたい場合は「->」の代わりに「=>」を使用します。 コマンドの実行結果は、以下に示す特殊変数に格納され、呼び出すことができます。
コマンド名 | 意味 |
---|---|
$RESULT | 標準出力 |
$ERROR | 標準エラー出力 |
$STATUS | ステータスコード |
リモートコマンドの実行
__host__, __user__, __password__ という特殊変数に値を設定することで、sshで対象ホストに接続し、シェルコマンドを実行します。[__host__ = '192.168.200.101', __user__ = 'kompira', __password__ = 'yourpass'] -> ['whoami'] -> print($RESULT) -> # 'kompira' [__user__ = 'root', __password__ = 'rootpass'] -> ['whoami'] -> print($RESULT) # 'root'上記例ではhost, user, passwordをコード中に直接記述していますが、Kompiraの別の場所にホスト情報をまとめて保存しておき、それを呼び出すことで接続先を指定する方法もあります。
また、ここでは説明を省略しますが、ポート番号、sshキーファイル、踏み台経由のアクセスの設定も可能です。
5. 他のジョブフロー、スクリプトの呼び出し
KompiraはUNIXライクなファイルシステムを持っており、各ジョブフローやスクリプトファイル、その他データを管理します。 ジョブフローからは、他のジョブフローを呼び出して実行することができます。# sub_jobflow print('This is sub jobflow') -> return(result='OK')
# main_jobflow print('サブジョブフローを実行') -> [./sub_jobflow] -> print($RESULT) # 'OK'
シェルスクリプトやPythonスクリプトをジョブフローと同様にKompira上に保存し、それを呼び出すことも可能です。
#!/bin/bash echo Hello world from shell script
# main_jobflow print('スクリプトを実行') -> [./sample_script] -> print($RESULT) -> # ローカルでスクリプトを実行 [__host__ = '192.168.100.100', __user__ = 'kompira', __password__ = 'yourpass'] -> [./sample_script] -> print($RESULT) # リモートでスクリプト実行
ジョブフローのパラメータ
ジョブはパラメータを受け取ることができます。# sub_jobflow |param1 = 'Hello'| |param2 = 'World'| print('This is sub jobflow') -> print(param1, param2) -> return(result='OK')
# main_jobflow print('サブジョブフローを実行') -> [./sub_jobflow: param1='こんにちは', param2='世界'] -> print($RESULT)
パラメータのあるジョブフローをブラウザ上で実行する場合、フォームで値を変更した上で実行できます。
6. 組込み関数
これまでに登場したprint, returnは組込み関数の例です。 関数名(引数1, 引数2, ...)のような形で記述します。7. 簡単なジョブフローの記述例
サーバで複数のコマンドを実行して結果をメール送信する
|target_server = '10.20.0.103'| |user = 'kompira'| |password = 'pass'| [__host__ = target_server, __user__ = user, __password__ = password] -> ['whoami'] -> [res1 = $RESULT] -> ['ifconfig'] -> [res2 = $RESULT] -> ['df -T'] -> [res3 = $RESULT] -> [mail_title = '[${target_server}] コマンド実行結果'] -> [mail_body = ''' コマンドの実行結果です。 ***** whoami ${res1} ***** ifconfig ${res2} ***** df -T ${res3} '''] -> mailto(from_user = 'kompira@fixpoint.co.jp', to = 'test@fixpoint.co.jp', title = mail_title, body = mail_body)
TITLE: [10.20.0.103] コマンド実行結果 コマンドの実行結果です。 ***** whoami kompira ***** ifconfig eth0 Link encap:Ethernet HWaddr 00:0C:29:EE:6C:B1 inet addr:10.20.0.103 Bcast:10.20.255.255 Mask:255.255.0.0 inet6 addr: fe80::20c:29ff:feee:6cb1/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:3074994 errors:0 dropped:0 overruns:0 frame:0 TX packets:2421537 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:2821766482 (2.6 GiB) TX bytes:871138648 (830.7 MiB) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:6728702 errors:0 dropped:0 overruns:0 frame:0 TX packets:6728702 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:1631148853 (1.5 GiB) TX bytes:1631148853 (1.5 GiB) ***** df -T Filesystem Type 1K-ブロック 使用 使用可 使用% マウント位置 /dev/mapper/vg_testserver-lv_root ext4 51606140 10702088 38282612 22% / tmpfs tmpfs 961824 500 961324 1% /dev/shm /dev/sda1 ext4 495844 144765 325479 31% /boot /dev/mapper/vg_testserver-lv_home ext4 150245636 6341484 136272076 5% /homemailtoはメールを送信する組込み関数です。 例えばこのジョブフローを監視サーバからのアラートを受けて実行するように設定すると、アラートが起きたサーバの状態調査が行えます。
8. まとめ
Kompiraでは、上記のような文法のジョブフロー言語を使って、サーバ運用の手順を記述していきます。ここでは紹介しきれませんでしたが、Kompira上に保存したデータにアクセスする方法、他サーバからのアラートを受けてジョブフローを開始する方法などもあります。