Zabbix温度監視 No.04 UserParameterを使って温度を取得する

cronでzabbix_senderを定期的に実行するのもいいのですが、ZabbixならUserParameterを使って独自のキーを定義が汎用性があります。zabbix_agentd.confをガシガシいじりましょう。

■UserParameterを設定する

UserParameterはZabbixエージェントに独自の定義を追加するための機能。詳細は公式ドキュメントのユーザーパラメータを読めばだいたいわかります。

今回は前回のコマンドをベースにpcsensor-1.0.3で対応したTEMPerV2を使えるよう修正してUserParameterを設定してみます。

# vi /etc/zabbix/zabbix_agentd.conf
UserParameter=usb.temper[*],sleep "$3";/opt/pcsensor/pcsensor -c -d -D$1 -n$2|awk NR==$2 |awk '{print $$NF}' | sed -e 's/C*$$//'

まずキーを設定します。なんでもいいのですがUSB温度計とわかりやすいようにusb.temper[*]としました。[]の中にはZabbix側から「,」で区切った3つの数値を設定することになり、この後のパラメータで利用する$1/$2/$3に値を置換することができます。

キー設定のあとは[,]に続けて実行したいコマンドを登録します。
まずsleepコマンド。これは連続してpcsensorを実行するとUSB温度計がスタックしてしまうので明示的に待機時間を設けて対処します。ここでは$3としたのでusb.temper[A,B,C]のCの値が置換されます。スタック回避は1秒あれば十分なはず。

次にpcsensorをフルパスで指定し温度計を指定するためオプション-Dを使います。続く$1はusb.temper[A,B,C]のAの値が利用されるので、この値を増やせば複数のUSB温度計に対応可能です。

その次はTEMPerV2対応として2つ目のセンサーに対応します。pcsensor1.0.3ではオプション-n2で2個目のセンサーに対応し、センサーが1つの場合はオプション無しか-n1でも良いそう。-n$2とすることでusb.temper[A,B,C]のBで1か2を指定することにします。

ただし2を指定すると1行目に1つ目のセンサーの温度も表示する仕様となっているため、「awk NR==」で指定行$2の値だけを取り出します。

# /opt/pcsensor/pcsensor -D0 -n2 -c
2015/08/08 16:07:27 Temperature0 101.45C
2015/08/08 16:07:27 Temperature1 0.00C

2つ目のセンサー(2行目)だけを取り出すにはawk NR==2と組み合わせる
# /opt/pcsensor/pcsensor -D0 -n2 -c |awk NR==2
2015/08/08 16:07:49 Temperature1 0.00C

TEMPerV2を持っていないので厳密には未検証ですが、1.0.3の解説を読む限りでは問題ないはず。

最後はawkで最終フィールドだけを抽出し、単位Cを削除するために「|awk ‘{print $$NF}’ | sed -e ‘s/C*$$//’」を追加してUserParameterの設定は終了です。

■再起動の前にzabbixユーザをrootグループ登録する

pcsensorをrootユーザでmakeしたせいなのか、OtherにRとXが付与されているのにzabbixエージェントが実行できませんでした。仕方ないのでrootグループにzabbixユーザを追加します。zabbixユーザはログオンこの時、「useradd -G」よりも「gpasswd -a」がお薦め。useraddだとついうっかり既に所属しているグループから外してしまう場合がありますが、gpasswdなら言葉通り指定したグループに追加できるのでケアレスミスを減らせます。

※Zabbixユーザをrootグループに追加
# gpasswd -a zabbix root
Adding user zabbix to group root

※rootグループに所属できたか確認
# cat /etc/group
root:x:0:zabbix
bin:x:1:bin,daemon

※Zabbixユーザが所属しているグループを確認
# id zabbix
uid=495(zabbix) gid=495(zabbix) 所属グループ=495(zabbix),0(root),3(sys)

※ZabbixエージェントにZabbixユーザのアクセス権を反映するために再起動する
# service zabbix-agent restart
Shutting down Zabbix agent:                                [  OK  ]
Starting Zabbix agent:                                     [  OK  ]
■zabbix_getでZabbixサーバからエージェントに対してアイテムを取得可能か試験する

ここまで来ればあともう少しです。
ZabbixのGUIからアイテムを登録する前に、Zabbixサーバでzabbix_getを使ってエージェントに対しコマンドで明示的にアイテムを取得できるか確認します。

※温度計1-センサー1
# zabbix_get -s 127.0.0.1 -k usb.temper[0,1,0]
34.19

※温度計1-センサー2
# zabbix_get -s 127.0.0.1 -k usb.temper[0,2,0]
0.00

※温度計2-センサー1
# zabbix_get -s 127.0.0.1 -k usb.temper[1,1,0]
36.25

※温度計2-センサー2
# zabbix_get -s 127.0.0.1 -k usb.temper[1,2,0]
0.00

温度計1と2、センサー1と2がそれぞれ別の数値を表示できているので大丈夫でしょう。

■Zabbixでアイテムを登録する

最後にZabbixのGUIからアイテムを登録して完成です。アイテム作成で下記の設定を行えば、任意の更新間隔で温度を取得可能になります。

タイプ Zabbixエージェント
キー usb.temp[温度計,センサー,待機時間]
データ型 数値(浮動小数)

usb.temper-item