3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ZABBIXでISC DHCPの状態を監視する

Last updated at Posted at 2020-10-05

ZABBIXでISC DHCPサーバーでのIPアドレスの割り当て状態を監視しようと思ったら何故かPerlなどで書かれたそこそこに規模の大きなスクリプトを使うような例しか見つけられなかったのでWAKを使って自分で実装してみました。

/usr/local/bin/dhcpd_statusに保存したシェルスクリプトではISC DHCPのリリース記録(dhcpd.leases)をawkで解析して使用中(active)、解放済み(free)、未割り当て(noassign)、割り当て可能(available)、プールに割り当てられた数(quota)のそれぞれを表示します。

/usr/local/bin/dhcpd_status
#!/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権限で実行できるように設定しています。

/etc/suders
zabbix    ALL=(ALL)       NOPASSWD: /usr/local/bin/dhcpd_status
Defaults!/usr/local/bin/dhcpd_status !requiretty

/etc/zabbix/zabbix_agentd.confではzabbix_serverからの要求に応じて先ほど用意したシェルスクリプトを呼び出します。

/etc/zabbix/zabbix_agentd.conf
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,取得したい項目]となっている
スクリーンショット 2020-10-06 8.09.41.png

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?