LLD機能はZabbix 2.0以降で実装された機能の為、zabbix-agent1.8には標準装備されていません。
そのため、管理画面上でディスカバリルール(vfs.fs.discoveryやnet.if.discovery)を設定しても値を取ることができません。
zabbix-agentのバージョンアップをすれば問題はすぐに解決するのですが、環境によってはそれができない場合もあります。
そんなときの対応方法を記載致します。
▼スクリプトファイルの作成
vfs.fs.discoveryキーでは/proc/mountsに記載されている内容を整形したものを取得しています。
そこでvfs.fs.discoveryキーと同様の結果が返ってくるように、/proc/mountsの中身を整形して返すスクリプトファイルを作成し、それを実行することでvfs.fs.discoveryキーに対応していないzabbix-agent1.8でもディスカバリルールを使用できます。
下記が/proc/mountsの中身を整形して返すスクリプトファイルになります。
# !/usr/bin/perl
$first = 1;
print "{\n";
print "\t\"data\":[\n\n";
for (`cat /proc/mounts`)
{
($fsname, $fstype) = m/\S+ (\S+) (\S+)/;
$fsname =~ s!/!\\/!g;
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\t]\n";
print "}\n";
net.if.discoveryに関しても同様で/proc/net/devの内容を整形したものを取得しているだけなので、vfs.fs.discoveryと同じように別途スクリプトファイルを作成して、zabbix-agent1.8でもディスカバリルールを使用できます。
# !/usr/bin/perl
$first = 3;
print "{\"data\":[";
for (`cat /proc/net/dev`)
{
if(!/:/)
{
$first--;
next;
}
($ifname) = m/(\S+):/;
print "," if not $first;
$first = 0;
print "{\"{#IFNAME}\":\"$ifname\"}";
}
print "]";
print "}\n";
▼UserParameterへの登録
スクリプトファイルを作成するだけではzabbix管理画面にLLDを登録しても認識できないので、zabbix-agentの設定ファイルに下記のようにスクリプトファイルを登録する必要があります。
UserParameter=vfs.fs.discovery,/opt/bin/vfs_fs_discovery.pl
UserParameter=net.if.discovery,/opt/bin/net_if_discovery.pl
※Userparameterとは何かについては公式サイトをご参考下さい
https://www.zabbix.com/documentation/2.2/jp/manual/config/items/userparameters
以上でLLDに対応していないzabbix-agentのバージョンでもLLDを使用できるようになります。もちろん、zabbixサーバ自体にLLD機能がなければできませんが...