本記事は記事「実践ServiceNow - DNS申請処理の作成 (その1)」の続きです。本記事では作成した申請書を処理するフローを作成します。
https://qiita.com/htshozawa/items/cb233caf24f64dda3dac
実行フローの作成
処理を自動化するためにはフローを定義します。ServiceNowにはFlow DesignerとWorkflowという2つのフロー定義ツールがあります。Flow DesignerとはServiceNowが新しく開発されたツールで簡単なフローであればプログラム無しでフローを定義することができます。Workflowは旧ワークフローツールであります。ServiceNowでは新しく開発するのであればFlow Designerを利用することを強く推奨しています。ただし、まだ多くのアプリケーションはWorkflowを利用しているため、それらアプリケーションを利用する場合はWorkflowを利用します。
Flow DesignerとWorkflowの他にもスクリプトでフローを定義することもできますが、保守性を考えると一番簡単に利用できるFlow Designerを使うことがよいです。Flow Designerでは多くの標準部品がありますが、自分でもスクリプトで部品を開発することができるので殆どのことはできます。
今回はFlow Designerで新規に次のフローを定義利用します。
TRIGGERはフローを起動するイベントの定義です。指定した日時、アプリケーションから起動、フォームが登録された場合に起動することができます。今回はフォームに登録された場合に起動するので「Service Catalog」を選択しています。
ACTIONSとは実行する処理です。先ずフォームの変数セットからドメイン情報を取出して、次に検証して、問題が無ければDNS登録を行い申請の状況を変更します。ただし、DNS登録を行う外部処理を作成する必要があるので、その処理は今は省いています。
ドメイン検証に問題がある場合は申請を差し戻すように状況を変更します。それでは次の手順でフローを定義します。
カスタムアクションの作成
1.アプリケーションナビゲータから「flow」を検索して、「プロセス自動化」下の「Flow Designer」を選択します。Webブラウザの別タブでFlow Designerが開きます。ポップアップツール防止ツールを利用されている場合は注意メッセージが表示されるので、許可します。
2.フロー本体を定義する前にフローの中で標準で提供されていない処理を作成します。処理は「アクション」として定義します。
ページの右上の「新規」を選択して、「アクション」を選択します。
3.アクションの「名前」と「説明」を記入して「送信」ボタンを押下します。
4.アクションの定義ページが表示します。先ずはアクションの入力と出力を定義します。
「入力の作成」ボタンを選択します。
5.入力引数のラベルと名前を入力します。編集セットを処理するので、タイプは要求型への参照にします。タイプの選択はドロップダウンリストを展開して、「ref」を入力して表示される「Reference」の右の矢印を押下します。
項目名 | 値 |
---|---|
ラベル | requested_item |
名前 | requested_item |
タイプ | Reference.要求アイテム |
6.検索ボックスに「Reference.」が入力されるので「要求」を追加します。表示される項目から「要求アイテム[sc_req_item]」を選択します。
7.入力を必須に設定します。
8.Actionの出力を定義します。左側のアクションアウトラインから「出力」を選択して「出力の作成」ボタンを押下します。
10.次のように設定します。
項目名 | 値 |
---|---|
ラベル | dns_string |
値 | dns_string |
タイプ | String |
必須 | 必須 |
9.次の変数セットからドメイン名を取出してコンマ区切りの文字列に変換する処理を挿入します。
「入力」と「出力」の間の「+」を選択します。
10.表示されるステップ一覧から「スクリプト」を選択します。
11.Flow Designerでは全体のActionの入出力の他にステップ毎に入出力を定義する必要があります。
12.名前を「requested_item」にして、右側から入力変数下の「requested_item」を値にドラッグ&ドロップします。Flow Designerで既に定義された入出力変数はページの右に表示されるので、別のステップで利用する場合はこのように右側に表示される変数を値にドラッグ&ドロップします。
13.値に「action→requested_item」が記入されます。
14.次のスクリプトステップの出力を定義します。「出力変数」の「変数の作成」ボタンを押下します。
15.次のように入力します。コンマ区切り文字列に変換するのでString型にします。
項目名 | 値 |
---|---|
ラベル | dnslist |
名前 | dnslist |
タイプ | String |
必須フラッグ | 必須 |
16.変換するスクリプトを入力します。
(function execute(inputs, outputs){
var dns_array = [];
if(typeof inputs.requested_item.variables.dns_submission != 'undefined'){
var tblObj = inputs.requested_item.variables.dns_submission; // get variable set
if(tblObj !== null){
var row;
for(var i = 0;i < tblObj.getRowCount();i++){ // loop through variable set
row = tblObj.getRow(i);
if(row.domain_name){
var name = row.domain_name;
name = name.replace("ozawa-hi.co.jp", "ozawa-hi");
name = name.replace("ozawa-hi.com", "ozawa-hi");
dns_array.push(name);
}
}
}
}
outputs.dnslist = dns_array.join(", "); // convert array to csv and set to Output variable
})(inputs, outputs);
テストを実施
アクションの単体テストを実施します。
テストで利用する申請番号を取得
アクションの単体テストを実行する場合はアクションの入力パラメータを直接入力します。今回は要求アイテムレコードを入力パラメータとして定義しているため、要求レコードの番号を入力します。テストを実行するために先ずはその番号を取得します。
1.アプリケーションナビゲータから「要求」を検索して、「自分の要求」を選択して、テスト用登録した要求の番号の行を選択します。
2.要求フォームの下に表示される要求アイテム番号をメモします。テストを実行する時にこの番号を入力します。
テストの実行
作成したアクション定義ページに戻ります。
1.アクションを保存していない場合は「保存」ボタンを押下して定義した内容を保存します。
テストを実行するには「テスト」ボタンを押下します。
2.「requested_item」にメモした要求アイテム番号を選択します。
3.「テストを実行」ボタンを押下します。
4.実行が完了すると「Actionが実行されました。次を表示するひは: action、ここをクリックしてください。」リンクが表示されます。実行結果を表示するにはこのリンクをクリックします。
5.結果を確認します。
ドメイン検証アクション
入力したドメインが正しいか社内DNSサーバに問い合わせするアクションを作成します。ただし、社内DNSサーバと確認するためにはMIDサーバが必要になるため、今はただtrueを返すアクションを作成します。
1.新しいアクションを作成します。
「新規」ボタンを押下して「アクション」を選択します。
2.項目「名前」と項目「説明」を入力して「送信」ボタンを押下します。
3.今回はtrueを返すだけにします。
「出力」を選択して「出力の作成」ボタンを押下します。
4.次のようにラベル、名前、タイプ、必須フラグを設定します。
項目 | 値 |
---|---|
ラベル | rtncode |
名前 | rtncode |
タイプ | True/False |
必須フラグ | True |
5.出力変数にTrueを設定します。これによりこのアクションを実行するとTrueが返されます。
「編集モードを終了」ボタンを選択します。
6.rtncodeのチェックボックスをチェックします。
7.最後に「保存」ボタンを押下してアクションを保存します。
まだ未完成なので公開はしてません。
フローの定義
フローで利用するアクションを作成したのでフロー本体を作成します。
フローの作成
1.「フロー」タブを選択して「新規」ボタンを押す下します。
2.プロダウンメニューから「フロー」を選択します。入力後に「送信」ボタンを押下します。
3.項目名前と説明を入力します。
項目 | 値 |
---|---|
名前 | DNS Request Flow |
説明 | Process DNS update requests. |
未公開アクションを利用できるようにする
1.未公開のアクションを利用できるようにFlow Designerの設定を変更します。
右上の3つの点を選択して「設定」を選択します。
2.「ドラフトアクションを表示」を有効にします。これで未公開アクションを選択できるようになりました。
トリガーの設定
3.トリガーを設定します。トリガーとはこのフローを実行する条件です。指定した日付やメール受信イベントなどでフローを起動することができます。今回はサービスカタログフォームが登録されたら起動するため「サービスカタログ」を選択します。
4.選択した後に「完了」ボタンを押下します。
5.トリガー設定が畳まれて省略されます。
アクションの定義
フローで実行する処理を定義します。ServiceNowでは処理を「アクション」と呼びます。
先ずは作成したアクションを呼び出すようにします。
1.「+」又はその右の「アクション、フローロジック、またはサブフローを追加する場合に選択します」をクリックします。
2.作成したアクションを選択するので「アクション」を選択します。
アクションをインスタンスのすべてのフローで利用できるように作成したため、アクションは「Global」下にあります。
「Global」を選択して、作成したアクション「Extract DNS from RequestItem Variable」を選択します。
3.登録された要求アイテムを処理するように設定します。Flow Designerは各アクションの入力と出力の値を右側に表示します。この一覧から必要な変数をフィールドにドラッグ&ドロップします。
今回はServiceCatalogの要求アイテムを引き渡すように設定するとめ、右から「requested_item[要求アイテム]」フィールドにドラッグ&ドロップします。
4.これで作成したアクションの設定は終了なので、「完了」ボタンを押下します。
5.次に取得したドメインレコードを社内DNSサーバに確認するアクションを呼び出します。
同じように「アクション」を選択して、「Global」>「Validate Internal DNS」を選択します。
6.本来なら上のアクションから出力されたdns_stringを引き渡しますが、まだ未実装なのでこのまま「完了」ボタンを押下します。
7.DNSチェックの結果により分岐させます。エラー(結果がfalseの場合)は申請にエラーメッセージを追加します。
問題ない場合は申請をグループにアサインします。
分岐を追加するために「アクション、フローロジック、またはサブフローを追加する場合に選択します。」をクリックします。
8.フローの制御処理はフローロジック下にあります。
「フローロジック」タブを選択して、「if」を選択します。
9.フローにifが追加されます。「条件」に説明文を記述します。前処理の結果により分岐をするので、条件に前の処理「2 - Validate internal DNS」から「rtncode」を条件フィールドにドラッグ&ドロップします。
10.条件を「次の値に等しくない」、「True」設定して「完了」ボタンを押下します。
11.分岐毎に処理を追加します。右分岐はif文がtrueの場合で、直下がfalseになります。
先ずは申請されたドメインにエラーがある場合の処理を設定します。if文下の右側の「+」をクリックします。
12.申請にエラーメッセージを追加します。
申請はデータベーステーブルのレコードなので、「Update Record」処理を追加します。
レコード更新処理はServiceNowの標準機能なので「ServiceNow Core」を選択して、「Update Record」を選択します。
13.変更するレコードと項目を指定します。
申請レコードを更新するので、右側から最初にトリガー条件の結果である「要求アイテムRecord」を項目「レコード」にドラッグ&ドロップします。テーブル名は自動的に入力されます。
申請のコメントにメッセージを追加するので「フィールド」に「追加コメント」を選択して値を「申請に不正なドメインがあります。」を設定します。メッセージには変数の値を含めることもできます。例えば検証アクションの出力にエラー内容を変数messageに返される場合はメッセージを挿入箇所に右側から出力変数messageをドラッグ&ドロップします。
14.エラーの処理を終了します。Flow Designerではif文にEndアクションが無いとif文の左側の処理を継続して実行します。今回のように処理を終了させる場合は明示的にEndアクションを追加します。
Endアクションを追加するために追加したUpdate要求アイテムRecord直下の「+」を選択します
endが無い場合は次のようなif文です:
if (rtnCode != true) {
updateRecord(); // エラー処理
}
updateRecord(); // 正常処理
end文がある場合は次のようです:
if (rtnCode != true) {
updateRecord(); // エラー処理
return;
}
updateRecord();
15.「フローロジック」を選択して「終了」を選択します。
16.if分岐の左側の処理を追加します。
if分岐直下の大きな「+」をクリックします。
17.問題が無い場合は申請をグループに割当ます。グループに割り当てる処理もUpdate Recordで行います。
「ServiceNow Core」から「Update Record」を選択します。
18.同じく右側から「要求アイテムRecord」を項目「レコード」にドラッグ&ドロップします。
今回はグループに割り当てるので項目フィールドを「アサイン先グループ」にし、アサインするグループを選択します。下の例では「Network」にアサインしています。
18.これでフローの定義は完了です。右上の「保存」ボタンを押下します。フローは「有効化」されるまではアップデートセットに追加されません。しかし、有効化すると一般公開されてリビジョン管理がされます。有効化する前に十分にテストをすることを推奨します。
テストの実行
作成したフローをテストします。
1.テストを実行するには右上の「テスト」ボタンを押下します。
2.ポップアップダイアログが表示されます。テストで利用する要求アイテムレコードをドロップダウンリストから選択します。今回はメモしたレコードを選択します。
3.「テストを実行」ボタンを押下すると要求アイテムが処理されます。
4.実行が完了すると「Flowが実行されました。次を表示するには: flow、ここをクリックしてください。」と表示されます。
実行結果を表示するにはこのリンクをクリックします。
5.すべての処理が正常に終了したことを確認します。
確認のために変更されたレコードを表示するにはレコードを変更した「Update Record」アクションをクリックします。
6.Update Recordの詳細情報が表示されます。レコードの内容を表示するには選択したレコード番号をクリックします。
7.レコードが表示されます。残念ながらデフォルトの要求アイテムフォームには項目「アサイン先グループ」は含まれていません。値が設定されたか確認するには項目を追加します。
8.左上の「他のアクション」アイコンをクリックして、「構成」>「フォームデザイン」を選択します。
9.フィールド一覧から「アサイン先グループ」を右側フォームレイアウトにドラッグ&ドロップします。
10.項目「アサイン先グループ」がフォームレイアウトに挿入されたことを確認します。フィールドの右側に表示されている歯車は「編集」で、丸☓は削除です。フォームから項目を削除する場合は☓アイコンをクリックします。
11.要求アイテムフォームを再表示します。項目「アサイン先グループ」が挿入されて値が「Network」であることを確認します。
その3に続く