リモート監視 nagios-nrpe を使ってみる
Raspberry-Pi で WiFi スキャンをさせたいけど、警告を出すために raspberry-pi 側に nagios4 のような本格的な監視システムを入れるのは資源のムダに思えたので、軽量な監視とすべく、リモート監視用の nagios-nrpe-server を使ってみた。
メインサーバ port=5666 リモート 監視プラグイン nagios4 ----> check_nrpe ------------> nrpe ----> check_root nagios-nrpe-plugin nagios-nrpe-server
nrpe は リモートの監視プラグインを check_nrpe と nagios-nrpe-server が経由して呼出してくれる。
リモートの監視側
nagios-nrpe-server をインストールして、監視サーバからの接続を許可する。インターネット経由で監視するなら、5666 ポートが通るようにファイアウォールの設定が必要。
((( 必要パッケージのインストール ))) $ sudo aptitude install nagios-nrpe-server ((( /etc/nagios/nrpe.cfg ))) # 監視サーバからの接続を許可 allowed_hosts=127.0.0.1,::1,192.168.xx.00/24 ~~~~~~~~~~~~~~~~~(追加) ((( /etc/nagios/nrpe.d/enabled.cfg ))) # 監視するためのチェック処理を登録。nrpe.cfg から nrpe.d/*.cfg に設定を移動 command[check_root]=/usr/lib/nagios/plugins/check_disk -w 20% -c 10% -p / command[check_load]=/usr/lib/nagios/plugins/check_load $ARG1$ ((( /etc/default/nagios-nrpe-server ))) # 自宅内のような閉じた中でSSLが不要の場合 NRPE_OPTS="-n" ((( nagios-nrpe-server を再起動 ))) $ sudo systemctl restart nagios-nrpe-server
メインの監視サーバ側
nrpe用のプラグインをインストールすると、/etc/nagios-plugins/config/check_nrpe.cfg や /usr/lib/nagios/plugins/check_nrpe を入れてくれる。
((( 監視側にnrpe用のプラグインを追加 ))) $ sudo aptitude install nagios-nrpe-plugin # nagios or icinga はインストール済み ((( nrpe の入ったリモートが呼び出せるか確認 ))) $ /usr/lib/nagios/plugins/check_nrpe -H リモート -c check_root DISK OK - free space: / 21321 MB (74% inode=86%);| /=7363MB;23944;26937;0;29930 ((( /etc/nagios-plugins/config/check_nrpe.cfg ))) # nagios/icingaなどのcommand設定の確認 # this command runs a program $ARG1$ with no arguments and enables SSL support define command { command_name check_nrpe command_line /usr/lib/nagios/plugins/check_nrpe -H $HOSTADDRESS$ -c $ARG1$ } # this command runs a program $ARG1$ with no arguments and disables SSL support define command { command_name check_nrpe_nossl command_line /usr/lib/nagios/plugins/check_nrpe -H $HOSTADDRESS$ -c $ARG1$ -n } ((( nagios4 のサービス監視に check_nrpe を呼出す設定を追加 ))) define service{ use local-service host_name リモート service_description DISK check_command check_nrpe!check_root # check_command check_nrpe_nossl!check_root # SSLなしで設定した場合 } ((( nagios4 を再起動 ))) $ sudo systemctl restart nagios4
nagios4 で監視ができるようになったので、温湿度センサーや空気品質センサーの確認も nrpe 経由に変更してみた。
WiFiスキャンをさせてみた
自宅内のネットワークに繋がらない時があって悩んだら、外で使っていたモバイルルータがつけっぱなしで、自宅内ネットワークのサービスに接続できないのが原因だったりする。パケットも無駄に消費するので、自宅内でモバイルルータが動いていたら警告させるようにしたい。
wifi scan
メインサーバは有線だけなので、有線LAN接続で WiFi が空いている Raspberry-Pi で監視させてみた。
$ sudo iw dev wlan0 scan | grep "SSID: ルータのSSID"
最初は homebridge の homebridge-cmdswitch2 の state_cmd に仕込んでみたけど、モバイルルータが動いていたら警告してほしい。Siri のオートメーション経由で警告することもできるかもしれないけど、スマホに頼る形になるなぁ。
nagios で警告させたいけど、raspberry-pi に nagios を入れるのは資源のムダに思える。ということで、Raspberry-Pi には nagios の監視をリモートで呼び出す nagios-nrpe-server を 入れて、上記 iw コマンドを動かす check スクリプトを書いてみた。
check_iwscan
nagios-nrpe-server から呼出す際に、Raspberry-Pi で動かすのもあるし、OS 負荷が軽くなるように Lua で書いてみた。
#!/usr/bin/lua -- 見つけるべきSSID local check_list = {} check_list[ "tsaitoh.net" ] = "ok" check_list[ "tsaitoh.net_e5785" ] = "warning" check_list[ "tsaitoh.net_hwd14" ] = "critical" -- 見つけたSSID毎の数 local count = {} count[ "ok" ] = 0 count[ "warning" ] = 0 count[ "critical" ] = 0 -- スキャン結果を処理 local handle = io.popen( "/usr/bin/sudo /sbin/iw dev wlan0 scan" , "r" ) if handle then for line in handle:lines() do -- SSID を抽出 ssid = string.match( line , "^%s*SSID: (.+)$" ) if ssid then -- SSID のカウント local lv = check_list[ssid] if lv then count[lv] = count[lv] + 1 end -- print( ssid ) ; end end handle:close() end -- カウント結果に応じたexit値を決める local status = 0 local st_mess = "Ok" if count["critical"] > 0 then status = 2 st_mess = "Critical" elseif count[ "warning" ] > 0 then status = 1 st_mess = "Warning" end -- 結果の表示 print( string.format( "IWSCAN %s - ok:%d/warn:%d/critical:%d" , st_mess , count["ok"] , count["warning"] , count["critical"] ) ) os.exit( status )
MQTTの設定
MQTTとホームオートメーション
自宅サーバで、ホームオートメーションもどきで遊んでいるけど、デバイスとのデータのやり取りは軽量の MQTT プロトコルがあるらしい。M5Stack ATOM Lite などからの情報を上げる時などで遊べそうなので、実験してみよう。
# 現状では センサー側の Raspberry-Pi では inetd.conf などで問合せポートにアクセスがあったら測定値を echo バックするような設定となっている。
mosquittoのインストール
でもひとまずは、MQTT ブローカー のオープンソース実装 mosquitto をインストール。
ブローカーとなる Raspberry-Pi には、mosquitto, mosquitto-clients をインストール。
((( ブローカーで mosquitto のインストール ))) $ sudo aptitude install mosquitto mosquitto-clients
温湿度センサーを搭載したパブリッシャー側の Raspberry-Pi には、mosquitto-clients のみをインストール。最終的には Net::MQTT::Simple を使うようにしたから不要だけど動作試験には使える。
((( パプリッシャー側は mosquitto-client だけ入れる ))) $ sudo aptitude install mosquitto-clients
mosquitto はデフォルトで外部接続を受けないので、外部接続の設定を追加。Debian流で /etc/mosquitto/conf.d/00-remote-access.conf にリモートアクセスを受ける設定を追記。
# listener<tab>1883 だとエラーになった。項目区切りで tab 使えんのか???
後のブラウザで確認するために、websocket の機能も設定しておく。
((( 最小限の生接続でひとまず実験 ))) $ sudo vi /etc/mosquitto/conf.d/00-remote-access.conf listener 1883 # 1883 ポートで受信 allow_anonymous true # パスワード無し ((( Websocket の設定 ))) $ sudo vi /etc/mosquitto/conf.d/10-websocket.conf listener 15675 protocol websockets ((( mosquitto を再起動 ))) $ sudo systemctl restart mosquitto ((( パスワード認証を使うなら ))) $ sudo mosquitto_passwd -c /etc/mosquitto/passwd mqtt $ sudo vi /etc/mosquitto/mosquitto.conf (先頭に) per_listener_settings true $ sudo vi /etc/mosquitto/conf.d/00-remote-access.conf (追記) password_file /etc/mosquitto/passwd $ sudo systemctl restart mosquitto
MQTTの基本的な導通テスト
まずは基本的な導通テスト
((( ブローカー側 ))) $ sudo mosquitto_sub -d -t /sensor/place/temperature/host ((( パブリッシャー側 ))) $ mosquitto_pub -h ブローカーホスト名 -d -t /sensor/place/temperature/host -m 12.34 ((( 実験結果 ))) $ sudo mosquitto_sub -d -t /sensor/place/+/host Client (null) sending CONNECT Client (null) received CONNACK (0) Client (null) sending SUBSCRIBE (Mid: 1, Topic: /sensor/place/+/host, QoS: 0, Options: 0x00) Client (null) received SUBACK Subscribed (mid: 1): 0 Client (null) received PUBLISH (d0, q0, r0, m0, '/sensor/place/temperature/host', ... (4 bytes)) 12.34
パブリッシャー側のプログラム
外気?温度(トイレ)で温度湿度を測っている Raspberry Pi の温度情報更新処理の中に Perl でブローカー宛にパプリッシュする処理を埋め込むのなら、Net::MQTT::Simple で書くのが簡単。
Net::MQTT::Simple が HTTP::Tiny を使うけど、CPAN でインストールするパッケージは最小にしたいので、HTTP::Tiny は apt-get でインストール。
((( HTTP::Tiny をインストール ))) $ sudo aptitude install libhttp-tiny-perl ((( CPANで Net::MQTT::Simple をインストール ))) $ sudo perl -MCPAN -e shell cpan[..]> install Net::MQTT::Simple
retain(…) でメッセージを送る際に、複数の項目を連続で送る場合は、各項目毎に 30msec 50msec ほどの遅延が必要だった。
# パブリッシャー側の問題?/ブローカー側の問題? 20msec だと後続の retain が失敗した。30msecだと最後の retain が失敗(不安定)
use Net::MQTT::Simple; use Time::HiRes 'usleep' ; my $mqtt = Net::MQTT::Simple->new("ブローカーホスト名") ; # brokerのホスト名 $mqtt->retain( "/sensor/place/temperature/host" => "12.3" ) ; # センサーの値を送る時 usleep( 50000 ) ; # 50msecの遅延が必要 $mqtt->retain( "/sensor/place/humidity/host" => "67.8" ) ; # センサーの値を送る時 usleep( 50000 ) ; $mqtt->retain( "/sensor/place/pressuore/host" => "1023.4" ) ; # センサーの値を送る時
ひとまずサブスクライバの代わりに Web ブラウザで mosquitto の結果を見るための HTML , js をダウンロード。
$ cd /var/www/html $ sudo mkdir mqtt $ cd mqtt $ sudo wget https://raw.githubusercontent.com/rabbitmq/rabbitmq-web-mqtt-examples/master/priv/echo.html $ sudo wget https://raw.githubusercontent.com/rabbitmq/rabbitmq-web-mqtt-examples/master/priv/mqttws31.js
echo.html の受信するトピックの設定を修正。
((( 84行目 ))) var print_first = pipe('#first', function(data) { message = new Paho.MQTT.Message(data); message.destinationName = "/sensor/place/+/host"; // トピックを修正 debug("SEND ON " + message.destinationName + " PAYLOAD " + data); client.send(message); }); ((( 108行目 ))) var options = { timeout: 3, keepAliveInterval: 30, onSuccess: function () { debug("CONNECTION SUCCESS"); client.subscribe("/sensor/place/+/host", {qos: 1}); // トピックを修正 }, onFailure: function (message) { debug("CONNECTION FAILURE - " + message.errorMessage); } };
なんちゃってIPv6でトラブル
自宅では、IPv6 でインターネットにつながらない状態の癖に、IPv6 の運用実験として色々な設定をしている。
しかし、最近繋がらないページなどが時々出ていて、どうも IPv6 サイトが原因だと予測はしていた。
今回、病院に入っていて家に不在の時に限って、ママがゲームサイトに繋がらないと文句を言ってきた。今までは動いていたのだが、ゲームサイトにも IPv6 化が進んでいる中で、ゲームサービスが IPv6対応になったんだろうな。おかげで IPv4 しかつながらないネットワーク環境のくせに、スマホがインターネットに IPv6 で繋ごうとするのが原因。
自宅では、IPv6 対応のために、DHCPサーバで IPv6 アドレス配布の設定をしていた。しかしこれが誤解のもと。実は IPv6 アドレスの自動設定機能の radvd を動かしていて、この設定は動いていないと思っていたが、実は radvd の設定が生きていた。
このため、DHCPv6の設定を消しても、radvd が相変わらずスマホに IPv6 ルータ情報をアナウンスするため、IPv6 で外に繋がらない状態となっていた。
ということで、/etc/radvd.conf を別名で残しつつ、”sudo aptitude purge radvd” で radvd の機能を止めた。
wsl GUI がWindows10で利用可能に
Windows 10 の 22H2 が適用できるようになり、VcXsrvのような X11 サーバを起動しなくても、GUI の wsl が動かせるようになった。
KB5020030(「2022-11×64ベースシステム用Windows 10 Version 22H2の累積更新プログラム」)がインストールして、再起動などが終わらせておく。wsl が導入済みなら、PowerShell (管理者モード) で、wsl.exe –update を実行するだけ。wsl –version でバージョンが表示されるようになったら成功。
PS C:\WINDOWS\system32> wsl.exe --update インストール中: Linux 用 Windows サブシステム Linux 用 Windows サブシステム はインストールされました。 PS C:\WINDOWS\system32> .\wsl.exe --version WSL バージョン: 1.0.0.0 カーネル バージョン: 5.15.74.2 WSLg バージョン: 1.0.47 MSRDC バージョン: 1.2.3575 Direct3D バージョン: 1.606.4 DXCore バージョン: 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp Windowsバージョン: 10.0.19045.2311
LaTeX で 図入り文書を書く時によく使う簡単なエディタ tgif を使いたかったが、ISO8859-1 のフォントが使えずエラーがでたけど、xfonts-shinonome などを入れたら、無事に動くようになった。emacs なども動くし便利。
$ tgif Fatal Error in OpenFont(): Cannot open the Default(Msg)Font '-*-courier-medium-r-normal-*-14-*-*-*-*-*-iso8859-1'. Tgif aborted. $ sudo aptitude install xfonts-shinonome 以下の新規パッケージがインストールされます:
職場のWin10マシンはまだ使えず
うーむ、職場の Windows 10 は、相変わらず KB5020030 のアップデートが表示されない。”wsl –version” もエラーのまんまだな。Windows 11 にアップデートした方がいいのかな。
Node.js 18 大丈夫かな
以前、Raspberry-Pi に Node.js 18 系をインストールしたら、homebridge が動かなくなったので心配だったけど、今回は問題なく動いているみたい。
Linux 6.0がdebianに流れてきた
Linux 5.x のマイナーバージョン番号が大きすぎるという理由もあっての Linux 6.0 の登場だけど、Debian(bookworm/sid) にも linux-image-6.0.0-2 (6.0.3) が流れてきた。
Rust の導入も Linux 6.1 で行われる予定とのことで、大きな変更も少ないし、普通に aptitude safe-upgrade でインストールされた。(^^;
$ uname -a Linux perrine 6.0.0-2-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.0.3-1 (2022-10-21) x86_64 GNU/Linux
今までのメジャーバージョン番号の更新の際には、競合パッケージがでるから aptitude full-upgrade じゃないと導入できないのが普通。
hb-service upgrade-node で更新
Raspberry-Pi で動かしている homebridge だけど、node.js の更新は curl とか使ってたけど、hb-service でインストールできるんだ。便利。
$ sudo hb-service update-node
node.js もメジャーバージョンが、16 から 18 に以降したうえで、最新の node.js 19 が発表されたみたい。
smartd の警告
サーバから以下のようなメールが送られてくるようになってきた。
This message was generated by the smartd daemon running on: host name: perrine DNS domain: tsaitoh.takefu.fukui.jp The following warning/error was logged by the smartd daemon: Device: /dev/sda [SAT], 5 Offline uncorrectable sectors.
syslog にも記録があるとのことなので確認すると、
Oct 5 22:32:04 perrine smartd[565]: Device: /dev/sda [SAT], 5 Currently unreadable (pending) sectors Oct 5 22:32:04 perrine smartd[565]: Device: /dev/sda [SAT], 5 Offline uncorrectable sectors
やばいと思いながらも /dev/sda を確認すると、古いHDDをつなげて rsync などでバックアップをとるようにしているデバイスなので、ひとまず安心。
(2022/12/08) 警告メール止まったみたい
運用の中、バックアップ用のドライブだったけど、バックアップ処理の中で利用セクタから外れたのか、警告メールが来なくなったな。
fetchmail daemon が勝手に起動
自宅サーバでは、丹南ケーブルの自分宛の spam だらけのメールを捨てるために、夜中に fetchmail を起動するようにしている。
状況
しかし、最近 「別の fetchmail が動いているのでエラー」が発生している。確認をすると、自分の ID の fetchmail が daemon にて動いている。
fetchmail --nodetach --daemon 300
よくよく調べると login 時に、 “systemctl –user start fetchmail.service” にて起動される様子。
対応
システム全体の systemctl –user での起動は、/etc/systemd/user/default.target.wants にて管理されていて、以下のようなリンクが張られている。
fetchmail.service -> /usr/lib/systemd/user/fetchmail.service
ということで、以下のコマンドで勝手に起動される fetchmail を抑止する。
$ cd /etc/systemd/user/default.target.wants $ sudo rm fetchmail.service
正しい systemd での設定方法
今回は、こういう力任せの方法をとったけど、こちらの資料を見ると、以下のやり方が正しい方法っぽいな。試しに、リンクを元に戻して下記コマンドを実行すると、リンクを消してくれていた。
$ sudo systemctl --global disable fetchmail.service
“~/.config/systemd/user/*” にユーザ独自にサービスを登録するのなら、”systemctl –user enable oooo.service” を実行する。
“/etc/systemd/user/default.target.wants” を変更するなら “systemctl –global enable(or disable) oooo.service” を実行する。