ZABBIXでISC DHCPサーバーでのIPアドレスの割り当て状態を監視しようと思ったら何故かPerlなどで書かれたそこそこに規模の大きなスクリプトを使うような例しか見つけられなかったのでWAKを使って自分で実装してみました。
/usr/local/bin/dhcpd_status
に保存したシェルスクリプトではISC DHCPのリリース記録(dhcpd.leases)をawkで解析して使用中(active)、解放済み(free)、未割り当て(noassign)、割り当て可能(available)、プールに割り当てられた数(quota)のそれぞれを表示します。
#!/bin/sh
pattern=`echo -n "${1}"|sed -e 's/\./\\\\\\\\./g'`
active=`awk -v pattern="$pattern" '/^lease / { if ( $2 ~ pattern ) { curlease = $2; } else { curlease = "" } } /^ binding state / { if ( curlease != "" ) { lstates[curlease] = $3; } } END { for (curl in lstates) { tstates[lstates[curl]]++; } print tstates["active;"]; }' /var/lib/dhcpd/dhcpd.leases`
free=`awk -v pattern="$pattern" '/^lease / { if ( $2 ~ pattern ) { curlease = $2; } else { curlease = "" } } /^ binding state / { if ( curlease != "" ) { lstates[curlease] = $3; } } END { for (curl in lstates) { tstates[lstates[curl]]++; } print tstates["free;"]; }' /var/lib/dhcpd/dhcpd.leases`
pattern=`echo -n "^[\\t ]*range[\\t ]*${1}"|sed -e 's/\./\\\\\\\\./g'`
quota=`awk -F'[\t; ]*' -v pattern="$pattern" 'BEGIN { ttl = 0; } $0 ~ pattern { split($3, ip_from, "."); split($4, ip_to, "."); ttl += ip_to[4] - ip_from[4]; } END { print ttl; }' /etc/dhcp/dhcpd.conf`
noassign=$(($quota-$active-$free))
echo active: $active
echo free: $free
echo noassign: $noassign
available=$(($free+$noassign))
echo available: $available
echo quota: $quota
パラメーターを付けずに実行すると全てのサブネットの合計で計算
# /usr/local/bin/dhcpd_status
active: 55
free: 313
noassign: 328
available: 641
quota: 696
パラメータにサブネット部分のネットワークアドレス(ピリオドを含む)を与えると指定されたサブネットの値を計算
[root@zeus ~]# /usr/local/bin/dhcpd_status 192.168.1.
active: 41
free: 128
noassign: 0
available: 128
quota: 169
/etc/suders
では先ほどのシェルスクリプトをroot権限で実行できるように設定しています。
zabbix ALL=(ALL) NOPASSWD: /usr/local/bin/dhcpd_status
Defaults!/usr/local/bin/dhcpd_status !requiretty
/etc/zabbix/zabbix_agentd.conf
ではzabbix_serverからの要求に応じて先ほど用意したシェルスクリプトを呼び出します。
UserParameter=isc.dhcpd[*],sudo /usr/local/bin/dhcpd_status $1 | grep $2 | cut -d' ' -f 2
zabbix-agentdのテストコマンドで値が取得できることを確認する
# zabbix_agentd -t isc.dhcpd[192.168.1.,active]
isc.dhcpd[192.168.1.,active] [t|72]
同様にzabbix-getでも確認してみる
# zabbix_get -s 127.0.0.1 -k isc.dhcpd[192.168.1.,active]
isc.dhcpd[192.168.1.,active] [t|72]
※zabbix-getだとスクリプトなどが実際にzabbix-agentdを動作させているアカウントの権限で実行されるのでsuderの設定のミスなどを発見できる
あとはZABBIXサーバーでISC DHCPサーバーを稼働させているホストの監視アイテムにDHCP関連のアイテムを追加すれば目的の値を取得できる
アイテムのキーはisc.dhcpd
パラメーターは[サブネットのIP,取得したい項目]
となっている