2013年12月5日

Kompiraジョブフロー言語基礎文法最速マスター

Kompiraとは、弊社で開発している「運用自動化プラットフォーム」を指します。
本稿では、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% /home
mailtoはメールを送信する組込み関数です。 例えばこのジョブフローを監視サーバからのアラートを受けて実行するように設定すると、アラートが起きたサーバの状態調査が行えます。

8. まとめ

Kompiraでは、上記のような文法のジョブフロー言語を使って、サーバ運用の手順を記述していきます。
ここでは紹介しきれませんでしたが、Kompira上に保存したデータにアクセスする方法、他サーバからのアラートを受けてジョブフローを開始する方法などもあります。