【アイデア求む】”1対多”の関係を持つ複数の情報を1画面で確認したい

Shota Nakamura
Tera Guru

1対多の関係を持つ複数の情報をServiceNowで見やすく表現する方法を探しています

【前提事項】

  • 物理サーバと仮想マシンの情報をServiceNowで確認したい
  • 1物理サーバに対して複数の仮想マシンが紐づくため、テーブルの構成は以下のようになる想定
    • テーブルA:物理サーバの情報を格納
    • テーブルB:仮想マシンの情報を格納。テーブルAを参照する
    • AとBは1対多の関係

【実現したいイメージ】

  • 添付1のように、1画面で複数の物理サーバとそれにひもづく複数の仮想マシンの情報を確認できるようにしたい
  • テーブルAのサーバ名とテーブルBの仮想マシン名でソートしたい


【試したこと】

  • 添付2のように、テーブルBのリストにテーブルAの情報も表示した
    • この方法ではテーブルAの情報が重複して冗長に感じます
    • 画面上では、1カラムでしかソートできません
      (サーバ名でソートすると、仮想マシン名の並びが保証されない)

 

当方でリスト以外の方法を試しきれていなくて恐縮なのですが、
添付1のようなイメージで表現する方法についてアイデアお持ちの方、ぜひご教示いただけますと幸いです。

 

<添付1>

find_real_file.png


<添付2> ※左3つのカラムがテーブルAの情報。右2つのカラムがテーブルBの情報

find_real_file.png

 

 

1 件の受理された解決策

t_sadahisa
Giga Guru

こんにちは。
いくつかアイデアを提示させていただきます。

◆案1:カスタマイズしない方法

この内容についてはご要望の2点とも満たせません。
ホストにアクセスして、存在するVMを確認する形になります。

ESXiで仮想マシンを稼働させると考えた場合、
適切なクラスはcmdb_ci_esx_serverとcmdb_ci_vmware_instanceだと思われます。

2つの間にregistered on::Has registeredという関係を結べば、OOTBのビューで関連リストに追加されます。

 

◆案2:多少のカスタマイズ
VMを管理しているテーブルにReferenceを追加します。
1:nの場合はこの方法が最も簡単でしょう。

リストのビュー定義では、Dot-walkが可能なので、Referenceが持っている情報をリスト上に入れ込むことができます。
(List layout)
find_real_file.png

(実際に表示されるList)

find_real_file.png

 

あとは、Host側のNameでGroup byとかした上でVMのNameでソートすればご要望のとおりではないかと思います。

 

以上、ご参考になれば幸いです。

元の投稿で解決策を見る

5件の返信5

Hitoshi Ozawa
Giga Sage
Giga Sage

Nakamuraさん、

2つの方法があります。一つ目はサーバテーブルを作成して、仮想インスタンステーブルをサーバテーブルを継承(parentにして)作成することです。この場合は仮想インスタンステーブルに親テーブルであるサーバテーブルの列も含まれます。またサーバテーブルを開くとすべての子仮想インスタンステーブルの情報も表示されます。これが一般的な方法です。

 

find_real_file.png

例:

サーバテーブル

①サーバ名

②CPUコア数

③物理メモリ数

仮想インスタンステーブル

①仮想マシン名

②CPUコア数(VM)

もう一つの方法はサーバテーブルと仮想インスタンステーブルを無関係なテーブルとして定義してデータベースビューを作成します。

上記2つとは別にrelationshipを利用することもできます。一つのリストとして表示はされませんが、サーバフォームの下に仮想インスタンス一覧が表示されます。例えばユーザフォームの下のロールタブでそのユーザが付与されているロール一覧が表示されるようにです。

t_sadahisa
Giga Guru

こんにちは。
いくつかアイデアを提示させていただきます。

◆案1:カスタマイズしない方法

この内容についてはご要望の2点とも満たせません。
ホストにアクセスして、存在するVMを確認する形になります。

ESXiで仮想マシンを稼働させると考えた場合、
適切なクラスはcmdb_ci_esx_serverとcmdb_ci_vmware_instanceだと思われます。

2つの間にregistered on::Has registeredという関係を結べば、OOTBのビューで関連リストに追加されます。

 

◆案2:多少のカスタマイズ
VMを管理しているテーブルにReferenceを追加します。
1:nの場合はこの方法が最も簡単でしょう。

リストのビュー定義では、Dot-walkが可能なので、Referenceが持っている情報をリスト上に入れ込むことができます。
(List layout)
find_real_file.png

(実際に表示されるList)

find_real_file.png

 

あとは、Host側のNameでGroup byとかした上でVMのNameでソートすればご要望のとおりではないかと思います。

 

以上、ご参考になれば幸いです。

もうひとつリストビューでグループ化する方法と、ソートを複数設定する方法も投稿しておきます。
グループ化はカラム名でメニューを表示して、GroupBy~を選択。グループ化することで見やすくなります。
複数のソートはフィルター設定でAddSortを必要な分追加。
これらの設定はURLにも反映されるのでメニューに登録したりお気に入りに登録することができます。ただソートは、ちょっとした操作で上書きされたり、リセットされたりします。

iwai
Giga Sage

その添付1の画像のような表を作成してみました。
TableはQuery Builderで Server と VM のRelationship から作成しました。元々テーブルがあるならそれでも良いです。
今回はダッシュボードにDynamic Containsを使って表示しましたがUI PageでもUI Macroでも同じようにできます。

find_real_file.png

<?xml version="1.0" encoding="utf-8" ?>
<j:jelly trim="false" xmlns:j="jelly:core" xmlns:g="glide" xmlns:j2="null" xmlns:g2="null">
	<g:evaluate var="jvar_gr" object="true">
		// 表示するテーブルと検索条件を設定
		// CMDB Query Builder で Windows Serverと VM の Instantiates Relationship で Query した結果を表示テーブルとする
		// u_windows_server_1 u_vmware_virtual_machine_instance_1
		var gr = new GlideRecord("u_cmdb_qb_result_ce31a775703ddf5c4f5a7e7ab088c918f91b9bc7");
		gr.addQuery('query','6680e4741b301d50aab3b88edc4bcb57');
		gr.orderBy('u_windows_server_1.name');
		gr.orderBy('u_vmware_virtual_machine_instance_1.name');
		gr.query();
		gr;
	</g:evaluate>
	<g:evaluate var="jvar_rowspan" object="true">
		var rowspan = [];
		var parentValue = '  initialize  ';
		var parentNumber = -1;
		var i = 0;
		while (gr.next()) {
			// グループ化する条件
			if(gr.u_windows_server_1.name == parentValue){
				rowspan[parentNumber]++;
				rowspan.push(-1);
			}else{
				parentNumber = i;
				parentValue = '' + gr.u_windows_server_1.name;
				rowspan.push(1);
			}
			i++;
		}
		gr.restoreLocation();
		rowspan;
	</g:evaluate>
	<j:set var="jvar_uri" value="cmdb_ci_win_server.do?sys_id=" />
	<j:set var="jvar_row" value="0" />
	<table class="table table-bordered table-striped table-hover table-responsive">
		<tr>
		<td >物理サーバー名</td>
		<td >物理 CPUコア数</td>
		<td >物理 メモリ</td>
		<td >仮想マシン名</td>
		<td >仮想 CPUコア数</td>
		</tr>
		<j:while test="${jvar_gr.next()}">
			<tr>
				<g:evaluate var="jvar_win" object="true" expression="gr.u_windows_server_1.getRefRecord()" />
				<g:evaluate var="jvar_vm" object="true" expression="gr.u_vmware_virtual_machine_instance_1.getRefRecord()" />
				<j:choose>
					<!--rowspanでグループ化する条件、変数 rowspan が 0以上 -->
					<j:when test="${jvar_rowspan[jvar_row] &gt;= 0}">
						<td rowspan="${jvar_rowspan[jvar_row]}"><a href="${jvar_uri}${jvar_win.getValue('sys_id')}" target="_blank">${jvar_win.getValue('name')}</a></td>
						<td rowspan="${jvar_rowspan[jvar_row]}">${jvar_win.getValue('cpu_count')}</td>
						<td rowspan="${jvar_rowspan[jvar_row]}">${jvar_win.getValue('ram')}</td>
						<td><a href="${jvar_uri}${jvar_vm.getValue('sys_id')}" target="_blank">${jvar_vm.getValue('name')}</a></td>
						<td>${jvar_vm.getValue('cpus')}</td>
					</j:when>
					<!--それ以外はrowspanの後ろに続く、  -->
					<j:otherwise>
						<td><a href="${jvar_uri}${jvar_vm.getValue('sys_id')}" target="_blank">${jvar_vm.getValue('name')}</a></td>
						<td>${jvar_vm.getValue('cpus')}</td>
					</j:otherwise>
				</j:choose>
				<g:evaluate var="jvar_row" jelly="true" expression="parseInt(jelly.jvar_row)+1" />
			</tr>
		</j:while>
	</table>
</j:jelly>