目的
ASUSから出ている「LYRA VOICE」でnode_exporterを動かしたい
結果
動かすだけなら可能。ただし単体での常時稼働はできずいろんな理由で面倒である
経緯
RT-AC85Uを使っていたのですが、LAN内での大容量データ転送が多くなったためトライバンドルータを探していました。しかしながら、コロナの影響で多くのルータが品切れ状態となり、買おうと思っていたRT-AX92Uも値上がりしてしまいました。
そんな中LYRA VOICEというルータが(性能の割には)安く売られているということを知りました。一応トライバンドで、なぜかAmazonEchoと同等の機能を内蔵しています。今どきの802.11axなどもないですし、最大速度は866Mbpsであることから投げ売りなのでしょうか。1万円を切る価格で購入することができました。
そんなLYRA VOICEでも、node_exporterを動かしてみたいと思い試行錯誤しました。
そんな中LYRA VOICEというルータが(性能の割には)安く売られているということを知りました。一応トライバンドで、なぜかAmazonEchoと同等の機能を内蔵しています。今どきの802.11axなどもないですし、最大速度は866Mbpsであることから投げ売りなのでしょうか。1万円を切る価格で購入することができました。
そんなLYRA VOICEでも、node_exporterを動かしてみたいと思い試行錯誤しました。
必要なもの
- Prometheusが動作しているサーバ
- node_exporter (Architecture:armv7)
- LYRA VOICEへのssh接続が可能であること
作業詳細
バイナリのダウンロード
まずnode_exporterは「armv7アーキテクチャ対応」のバイナリをダウンロードします。
LYRA VOICEでunameを打つとわかります。
admin@LYRA_VOICE:/tmp/home/root# uname -a
Linux LYRA_VOICE 3.14.77 #1 SMP PREEMPT Tue Sep 17 15:19:22 CST
2019 armv7l GNU/Linux
PrometheusのダウンロードページからOperating system : linux 、Architecture : armv7を選択し、node_exporterをダウンロード・展開します。/jffsの配下であればどこでもいいとは思いますが、今回は「/jffs/scripts」というフォルダを作成し、そこに展開しています。
admin@LYRA_VOICE:/tmp/home/root# uname -a
Linux LYRA_VOICE 3.14.77 #1 SMP PREEMPT Tue Sep 17 15:19:22 CST
2019 armv7l GNU/Linux
スクリプトの作成
動作させるためにはnode_exporter以外にスクリプトを用意する必要があります。なくてもできるかもしれませんが、うまくいかなかったので作っています。これらのスクリプトも「/jffs/scripts」配下に保管しています。
check.sh
#!/bin/sh
CRU=`/usr/sbin/cru l | /bin/grep init.sh | /bin/grep -v
grep | wc -l`
# cronの登録数を確認し、変数に代入
if [ $CRU = 0 ] ; then
/usr/sbin/cru a check_node "*/5 * * * * /bin/sh
/jffs/scripts/init.sh"
fi
# cron行が1行もない場合に追加をする
#
このcheck.shは外部サーバから定期的に実行する(別にスクリプトあり)
#!/bin/sh
CRU=`/usr/sbin/cru l | /bin/grep init.sh | /bin/grep -v
grep | wc -l`
# cronの登録数を確認し、変数に代入
if [ $CRU = 0 ] ; then
/usr/sbin/cru a check_node "*/5 * * * * /bin/sh
/jffs/scripts/init.sh"
fi
# cron行が1行もない場合に追加をする
#
このcheck.shは外部サーバから定期的に実行する(別にスクリプトあり)
init.sh
#!/bin/sh
NODE=`/bin/ps | /bin/grep node_exporter| /bin/grep -v grep | wc
-l`
# node_exporterプロセスの動作を確認する
if [ $NODE = 0 ] ; then
chmod a+x /jffs/scripts/node_exporter
/jffs/scripts/node_exporter &
fi
#
node_exporterプロセスがない場合にnode_exporterを起動する。
# 起動前に(念のため)node_exporterに実行権限を付与する
結果的に以下のようになると思います。
#!/bin/sh
NODE=`/bin/ps | /bin/grep node_exporter| /bin/grep -v grep | wc
-l`
# node_exporterプロセスの動作を確認する
if [ $NODE = 0 ] ; then
chmod a+x /jffs/scripts/node_exporter
/jffs/scripts/node_exporter &
fi
#
node_exporterプロセスがない場合にnode_exporterを起動する。
# 起動前に(念のため)node_exporterに実行権限を付与する
admin@LYRA_VOICE:/jffs/scripts# pwd
/jffs/scripts
admin@LYRA_VOICE:/jffs/scripts# ls -l
-rw-rw-rw- 1 admin root
306 May 14 13:43 check.sh
-rw-rw-rw- 1 admin root
253 May 7 13:45 init.sh
-rwxrwxrwx 1 admin root
14896306 Jun 4 2019 node_exporter
admin@LYRA_VOICE:/jffs/scripts# pwd
/jffs/scripts
admin@LYRA_VOICE:/jffs/scripts# ls -l
-rw-rw-rw- 1 admin root
306 May 14 13:43 check.sh
-rw-rw-rw- 1 admin root
253 May 7 13:45 init.sh
-rwxrwxrwx 1 admin root
14896306 Jun 4 2019 node_exporter
このままでは当然動かないです。しかもリブートするたびにパーミッションが変わり実行権限が消されます(!)。スクリプト内にchmodコマンドがあるのはそのためです。そしてcheck.shを外部サーバから定期的に実行することでnode_exporterを動作させます
以下のスクリプトは外部サーバに保管し、cron等で定期実行します。1分おきはやりすぎだと思うので、10分おきとか30分おきが良いかと思います。それにより突然の再起動や、電源OFF/ONの際も(しばらくすれば)node_exporterが動作します。
以下のスクリプトは外部サーバに保管し、cron等で定期実行します。1分おきはやりすぎだと思うので、10分おきとか30分おきが良いかと思います。それにより突然の再起動や、電源OFF/ONの際も(しばらくすれば)node_exporterが動作します。
gw_check.sh
#!/bin/sh
PW="PASSWORD" # LYRA
VOICEに設定したパスワードを入れる
expect -c "
set timeout 5
spawn env LANG=C /usr/bin/ssh admin@192.168.0.1 \"/bin/sh
/jffs/scripts/check.sh\"
# IPアドレスはルータのIPアドレスです
expect \"password:\"
send \"${PW}\n\"
expect \"$\"
exit 0
"
※expectは事前にインストールしておきます
#!/bin/sh
PW="PASSWORD" # LYRA
VOICEに設定したパスワードを入れる
expect -c "
set timeout 5
spawn env LANG=C /usr/bin/ssh admin@192.168.0.1 \"/bin/sh
/jffs/scripts/check.sh\"
# IPアドレスはルータのIPアドレスです
expect \"password:\"
send \"${PW}\n\"
expect \"$\"
exit 0
"
まとめ
最善の手段かどうかはわかりませんが、とりあえずLYRA VOICEでnode_exporterを動かすことができました。RT-AC85Uの時はUSBメモリを挿入し、nvramの「usb挿入タイミングでスクリプトを実行する」パラメータをいじるだけで済みましたが、LYRA VOICEにはUSBポートがないことから同じ手段は使えず、遠回りをしてしまいました。また、今回は細かいパラメータをいじらずにdefaultで動かしています。時間ができたらチューニングしようと思います。