Kompira

Menu Menu

Enterprise Technical information

Kompiraジョブフローの基礎 ジョブフローから別のジョブフローを呼び出す

メールを送信する」では、指定の URL にリクエストを送り、その結果をメールで通知するジョブフロー (以降「メールでの通知」ジョブフローとする) を作成しました。

 

| url = "http://www.kompira.jp/" |

urlopen(url) =>
{ if $STATUS != 0 |
  then:
    mailto(
      to="tantou@sample.co.jp",
      from="operator@sample.co.jp",
      subject="障害通知",
      body="異常が検出されました"
    )
  elif $RESULT.code != 200:
    mailto(
      to="tantou@sample.co.jp",
      from="operator@sample.co.jp",
      subject="障害通知",
      body="異常が検出されました。エラーコードは %{code}" % $RESULT
    )
  else:
    mailto(
      to="tantou@sample.co.jp",
      from="operator@sample.co.jp",
      subject="正常通知",
      body="特に異常は認められませんでした。"
    )
}

 

ここでは mailto() を何度も呼び出していますが、これを別のジョブフローに切り出して、共通部品化してみます。

 


 

環境情報

本稿は、以下の環境で検証しています。

 

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

または

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

 


 

以下のようなジョブフロー「メール送信」を作成します。

 

| param_to      = "default@kompira.jp" |
| param_from    = "info@kompira.jp" |
| param_subject = "default subject" |
| param_body    = "default message" |

mailto(param_to, param_from, param_subject, param_body) ->
return('SENT')

 

ここでは mailto() の引数を、全てパラメータとして設定します。
この「メール送信」ジョブフローは、「メールでの通知」ジョブフローを以下の様に書き換えることで呼び出すことができます。

 

| url = "http://www.kompira.jp/" |
| to = "tantou@sample.co.jp" |
| from = "operator@sample.co.jp" |

urlopen(url) =>
{ if $STATUS != 0 | 
  then: 
    [./メール送信: 
        to,
        from,
        "障害通知",
        "異常が検出されました"
    ]
  elif $RESULT.code != 200:
    [./メール送信:
        to,
        from,
        "障害通知",
        "異常が検出されました。エラーコードは %{code}" % $RESULT]
  else:
    [./メール送信:
        to,
        from,
        "正常通知",
        "特に異常は認められませんでした。"
    ]
}

 

呼び出すところを見てみると、次のようになっています。

 

[./メール送信:
    to,
    from,
    "障害通知",
    "異常が検出されました"
]

 

このように [] 内にジョブフローを記載する事で、他のジョブフローを呼び出す事が出来ます。また [jobflow: パラメータ] として、呼ばれる側のパラメータを動的に指定する事が出来ます。パラメータが複数ある場合には上記のように “,(カンマ)” で区切って記載します。
呼ばれる側のジョブフロー (上記の場合は「メール送信」) でパラメータが定義されている順番で、呼ぶ側 (上記の場合は「メールでの通知」) のパラメータを並べます。

では、呼ばれる側の差出人アドレス (“param_from”) はデフォルト値 (“info@kompira.jp”) を使いたいような場合には、どのように呼び出したらいいでしょうか?
この場合には、呼ばれる側のパラメータ名を明示的に指定します。

 

[./メール送信:
    param_to=to,
    param_subject="障害通知",
    param_body="異常が検出されました"
]

 

パラメータ名を付加して呼び出す場合には、順番は前後しても構いません。

 

[./メール送信:
    param_body="異常が検出されました",
    param_to=to,
    param_subject="障害通知"
]

 

さて、ここで応答がなかった場合に Web サーバー関連のプロセス ( httpd , mysqld ) の起動状況を確認して、停止していた場合には再起動するジョブフロー「プロセス再起動」を作成して追加してみましょう。

プロセス再起動実行のためには sudo をパスワード入力無しで行う必要があるため、前準備として以下のように root (もしくは sudo をパスワード入力無しに行えるユーザー) をノード情報に登録します。

 

 

 

詳しい手順は「[事前準備] 接続先のサーバを登録する」にて紹介しております。

 

それでは「プロセス再起動」を作成してみましょう。このジョブフローを呼び出す際には通知メールの送信先アドレス等を引数に取るものとし、 ノード名は server1 とします。

 

| param_to = "default@kompira.jp" |
| param_from = "info@kompira.jp" |
| param_title = "確認通知" |

[
    __node__ = ./server1,
    __sudo__ = true
] ->
{ for procname in ['httpd', 'mysqld'] |
    print('$procname プロセスの動作を確認します') ->
    ['ps axuw | grep $procname | grep -v grep'] =>
    { if $STATUS == 0 |
        [./メール送信:
            param_to,
            param_from,
            param_title,
            "$procname プロセスは動作中です"
        ] ->
        continue
    } ->
    # プロセスが停止していた場合に再起動
    print('$procname プロセスは動作していません') ->
    ['service $procname start && sleep 5'] =>
    { if $STATUS != 0 |
        [./メール送信:
            param_to,
            param_from,
            param_title,
            "$procname の再起動に失敗しました"
        ] ->
        return(false)
    } ->
    # 再起動に成功した場合
    [./メール送信:
        param_to,
        param_from,
        param_title,
        "$procname を再起動しました"
    ]
} ->
return(true)

 

これを「メールでの通知」ジョブフローに追加すると、以下のようになります。

 

| url = "http://www.kompira.jp/" |
| to  = "tantou@sample.co.jp" |
| from= "operator@sample.co.jp" |

urlopen(url) =>
{ if $STATUS != 0 | 
  then: 
    [./メール送信:
        to,
        from,
        "障害通知",
        "異常が検出されました"
    ] ->
    [./プロセス再起動: to, from]
  elif $RESULT.code != 200:
    [./メール送信:
        to,
        from,
        "障害通知",
        "異常が検出されました。エラーコードは %{code}" % $RESULT
    ] ->
    [./プロセス再起動: to, from]
  else:
    [./メール送信:
        to,
        from,
        "正常通知",
        "特に異常は認められませんでした。"
    ]
}

 

上記で見てきた通り、共通する機能や処理に関しては、独立したジョブフローを作成しておくことで、繰り返し処理であったり複数のジョブフローから呼び出す事が可能になります。また、呼び出す側は実行時の条件指定が出来るため、条件に応じた対応を行う事が可能となります。

 

今回の記事では mailto() を同じ機能のジョブフローで置き換えるなど、極めて単純な例で説明をいたしましたが、もちろんまとまった大規模な処理を記述する事も可能です。

 

ただし、可読性・保守性を高めるためには1つのジョブフローで処理をすべて書くよりも、適切にジョブフローを分割して管理することが重要です。

スタートガイド

Kompiraジョブフローの基礎

ジョブフローの簡単な例

Kompiraの機能

外部との連携