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