Masteries

技術的なことや仕事に関することを書いていきます.

雑なチェックプラグインを書いた話

こんにちは, id:papix です. この記事は, 「Mackerel Advent Calendar 2018」の16日目の記事です.

qiita.com

昨日は, id:albacore さんの「学生サークルでMackerelを運用してみた話」でした. 闇に飲まれよ! (お疲れ様です!)

albacore.hateblo.jp

雑なチェックプラグインを書いた話

さて, 担当の日が来たにも関わらず, 良いネタがなかったので, 最近書いた雑なチェックプラグインの話をします.

自分は自宅にEdgeRouter Xを置いていて, 更に契約した回線がグローバルIP付きだったので, EdgeRouter XでVPNを使えるようにしたり, いろいろ遊んでいました. その時に書いた記事がこの辺りの記事です:

papix.hatenablog.com

先日, 外出中に自宅にあるEdgeRouter XへVPN接続をしようとしたところ, どうも繋がりませんでした. 「アレ?」と思って, VPN接続のために設定していたIPと, Mackerelに登録されているEdgeRouter XのグローバルIPを確認すると... なんと違うIPアドレスになっていました.

...ハイ, 要するに「グローバルIPは割り当てるが, それは固定ではない」というオチでした. 確かに契約している回線の公式サイトとかを見に行くとそのように書いてあって, 要するに自宅にある通信会社から貸与された機器(終端装置みたいなもの?)の電源が落ちたり, メンテナンスがある度に, 使えるグローバルIPが割り当てられる... という仕組みになっているようです.

check-gip

せめて, グローバルIPが変わった時に気づけるようになりたい. ...ということでMackerelで使えるチェックプラグインを作ってみました. 2時間くらいで雑に作ったので, 名前も「check-gip」という, なんかよくわからん感じの名前になっています.

github.com

これまで何度か, Mackerelのプラグインを作ったことはありましたが, 多分チェックプラグインを作るのは初めてです. とはいえ, Mackerelの場合は公式で提供しているチェックプラグイン集があり, それをお手本として作れば, そこまで苦労することはありませんでした.

github.com

使い方

今の自宅では, 通信会社から貸与された機器からLANケーブルがEdge Router Xのeth0に繋がっていて, ここにグローバルIPが割り当てられています. なので, グローバルIPを適当なドメインと紐づけて, その名前解決の結果と, Edge Router Xのeth0に割り当てられたグローバルIPアドレスを比較するプラグインを作ることにしました.

名前解決はnet.LookupHostで, インターフェイスからIPアドレスを取得する部分はGoのnetパッケージを使って強引に実装しました. 例えば, myhome.example.comにグローバルIPが設定されていて, それとチェックプラグインが動いてるサーバのeth0に割り当てられたIPアドレスをチェックするなら, このように設定します:

[plugin.checks.check_gip]
command = "check-gip --host myhome.example.com -i eth0"

これで, 例えばeth0に割り当てられたIPアドレスが変わってしまったりしたら, Mackerel上でアラートが出るようになります.

さいごに

最近書いた雑なプラグインの話をしました. ...ここまで書いていて, これよりも, 「指定したインターフェイスに割り当てられたIPアドレスと, 引数で渡したIPアドレスをチェックする」みたいな実装にして, check-interface-addressみたいな感じで提供した方が汎用性ありそう, と思いました. そういう感じで書き換えることも検討したいです.

...言いたかった事としては, Mackerelはチェックプラグインも割と簡単に作れるので, このような「俺得チェックプラグイン」をサクッと作って(今回はGoで書きましたが, 別にPerlでもRubyでもシェルスクリプトでも何でも作れます!)使えると便利! っていう感じです. 皆さんも是非俺得チェックプラグインを作ってみましょう!!!

明日は...

明日の担当は miwarin さんです. お楽しみに!