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

メールを送信する」では、指定の 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

または

ソフトウェア バージョン
Kompira Enterprise 1.6.8
OS CentOS Stream 8

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

| 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つのジョブフローで処理をすべて書くよりも、適切にジョブフローを分割して管理することが重要です。

TOP