データベースサーバー上のデータベースなど、あらゆる種類のエンティティを検出する、完全にカスタマイズされたLLDルールを作成することもできます。
そのためには、検出されたオブジェクトと、オプションでそれらのプロパティを指定するJSON文字列を返すカスタムアイテムを作成する必要があります。エンティティあたりのマクロの数に制限はありません。組み込みの検出ルールは1つまたは2つのマクロ(たとえば、ファイルシステム検出の場合は2つ)を返しますが、それ以上の数を返すことも可能です。
必要な JSON 文字列形式は、例を挙げるとわかりやすいでしょう。古い Zabbix 1.8 エージェント("vfs.fs.discovery"をサポートしていないエージェント)を実行しているものの、ファイルシステムを検出する必要がある場合を考えてみましょう。マウントされたファイルシステムを検出し、ファイルシステム名と種類を含む JSON 形式で出力する、Linux 用のシンプルな Perl スクリプトを以下に示します。このスクリプトを使用する方法の一つは、キー"vfs.fs.discovery_perl"を持つ UserParameter として使用することです。
#!/usr/bin/perl
$first = 1;
print "[\n";
for (`cat /proc/mounts`)
{
($fsname, $fstype) = m/\S+ (\S+) (\S+)/;
print "\t,\n" if not $first;
$first = 0;
print "\t{\n";
print "\t\t\"{#FSNAME}\":\"$fsname\",\n";
print "\t\t\"{#FSTYPE}\":\"$fstype\"\n";
print "\t}\n";
}
print "]\n";
LLDマクロ名に使用できる記号は、0-9、A-Z、_、. です。 小文字は名前に使用できません。
出力例(わかりやすいようにフォーマットを変更)を以下に示します。カスタム検出チェック用のJSONも同じ形式に従う必要があります。
[
{ "{#FSNAME}":"/", "{#FSTYPE}":"rootfs" },
{ "{#FSNAME}":"/sys", "{#FSTYPE}":"sysfs" },
{ "{#FSNAME}":"/proc", "{#FSTYPE}":"proc" },
{ "{#FSNAME}":"/dev", "{#FSTYPE}":"devtmpfs" },
{ "{#FSNAME}":"/dev/pts", "{#FSTYPE}":"devpts" },
{ "{#FSNAME}":"/lib/init/rw", "{#FSTYPE}":"tmpfs" },
{ "{#FSNAME}":"/dev/shm", "{#FSTYPE}":"tmpfs" },
{ "{#FSNAME}":"/home", "{#FSTYPE}":"ext3" },
{ "{#FSNAME}":"/tmp", "{#FSTYPE}":"ext3" },
{ "{#FSNAME}":"/usr", "{#FSTYPE}":"ext3" },
{ "{#FSNAME}":"/var", "{#FSTYPE}":"ext3" },
{ "{#FSNAME}":"/sys/fs/fuse/connections", "{#FSTYPE}":"fusectl" }
]
前の例では、キーがプロトタイプで使用されているLLDマクロ名と一致する必要がありますが、代わりにJSONPath {#FSNAME}
→ $.fsname
および {#FSTYPE}
→ $.fstype
を使用してLLDマクロ値を抽出することもできます。これにより、以下のスクリプトが可能になります。
#!/usr/bin/perl
$first = 1;
print "[\n";
for (`cat /proc/mounts`)
{
($fsname, $fstype) = m/\S+ (\S+) (\S+)/;
print "\t,\n" if not $first;
$first = 0;
print "\t{\n";
print "\t\t\"fsname\":\"$fsname\",\n";
print "\t\t\"fstype\":\"$fstype\"\n";
print "\t}\n";
}
print "]\n";
出力例(分かりやすくするためにフォーマットを変更)を以下に示します。カスタム検出チェック用のJSONも同じ形式に従う必要があります。
[
{ "fsname":"/", "fstype":"rootfs" },
{ "fsname":"/sys", "fstype":"sysfs" },
{ "fsname":"/proc", "fstype":"proc" },
{ "fsname":"/dev", "fstype":"devtmpfs" },
{ "fsname":"/dev/pts", "fstype":"devpts" },
{ "fsname":"/lib/init/rw", "fstype":"tmpfs" },
{ "fsname":"/dev/shm", "fstype":"tmpfs" },
{ "fsname":"/home", "fstype":"ext3" },
{ "fsname":"/tmp", "fstype":"ext3" },
{ "fsname":"/usr", "fstype":"ext3" },
{ "fsname":"/var", "fstype":"ext3" },
{ "fsname":"/sys/fs/fuse/connections", "fstype":"fusectl" }
]
そして、検出ルールの"フィルター"フィールドで、マクロとして"{#FSTYPE}"、正規表現として"rootfs|ext3"を指定できます。
カスタムLLDルールでは、マクロ名FSNAME/FSTYPEを使用する必要はありません。任意の名前を使用できます。JSONPathを使用する場合、LLD行は配列要素となり、オブジェクトになることもありますが、別の配列や値になることもあります。
ユーザーパラメータを使用する場合、戻り値は16MBに制限されることに注意してください。 詳細については、LLD 戻り値のデータ制限 を参照してください。