Mackerel で QNAP も監視したいのでする

最近、MacBookSSD の空き容量がいつの間にか無くなっていて、スワップを作れなくなった結果、フリーズするということがあって反省したのでちゃんと管理しようという気持ちになった。

ひとまず家にある中で壊れたりトラブルが起きると一番困るのは QNAP なので、これを監視することにした。

Mackerel は Go で書かれた agent を入れるだけでよい割にアラートの閾値をいい感じに定義することができるので便利。

QNAP で mackerel-agent を動かす

僕の持っている QNAP は TS-220 というモデルで CPU は ARM v5 で OS は Linux ベースらしい。

mackerel-agent は最近の CentOSDebian しか動作することを保証されていない:

For now, mackerel-agent is guaranteed to run only on CentOS 5/6 and Debian 6/7.

https://github.com/mackerelio/mackerel-agent#readme

とはいえ Go で書かれているし Linux ベースなら取り付く島が無いなんてことはないだろうと思ってちょっと試したら動いた。

テストは書いていないしかなりいい加減だがこれで動いた。

  • QTS (QNAP の OS) に入っている uname-o (Operating System) をサポートしていない
    • どのような意図でもって実装されていないのかは不明だけれどもさして重要な情報ではないので決め打ちで "Linux" とする
  • QTS に入っている df-P オプションをサポートしていないし出力の形式が少し違う
    • 1024-block1k-block だった
    • それ以外は特に書式に大きな違いはなかったので正規表現を修正する

Docker でビルドする

mackerel-agent は OS X ではビルドに失敗するので Docker を使うことにした。

Dockerfile:

FROM golang:cross

RUN mkdir -p /go/src/github.com/mackerelio
ADD ./mackerel-agent /go/src/github.com/mackerelio/mackerel-agent
WORKDIR /go/src/github.com/mackerelio/mackerel-agent
RUN make deps
CMD bash -c "GOOS=linux GOARCH=arm GOARM=5 CGO_ENABLED=0 make build && cp ./build/mackerel-agent /host/_mackerel-agent"

これで docker build -t mackerel-agent . && docker run -v "$(pwd)":/host mackerel-agent とすると _mackerel-agent が作られる。

Docker Hub Registry には golang が登録されているが、そのうちクロスコンパイルするための環境がセットアップされているタグを選ぶ。最新 (1.3) でよければ cross.

ビルドの際に指定している環境変数Optional environment variables を参照した。 また GOARM 変数については GoArm - go-wiki が詳しい。

ルート証明書が見つからないエラー

ビルドはできたものの実行時エラーが出る:

x509: failed to load system roots and no roots provided

意味がわからなかったが調べたところ x509 は SSL 通信のために使われているらしい。“roots” がよくわからなかったがルート証明書のことらしい。

ルート証明書が無いなら配置すればよいかと思ったもののどこに配置すればよいのかわからない。

Go において CertPool は参照すべき証明書を保持するオブジェクトの型で、SSL 通信などを扱うライブラリ (e.g. net/http) ではデフォルトではシステムの証明書を参照するようだった。

ではシステムの証明書の配置場所はどこかというと root_unix.go というファイルに定義されている。

var certFiles = []string{
        "/etc/ssl/certs/ca-certificates.crt",     // Debian/Ubuntu/Gentoo etc.
        "/etc/pki/tls/certs/ca-bundle.crt",       // Fedora/RHEL
        "/etc/ssl/ca-bundle.pem",                 // OpenSUSE
        "/etc/ssl/cert.pem",                      // OpenBSD
        "/usr/local/share/certs/ca-root-nss.crt", // FreeBSD/DragonFly
    }

QNAP では /etc/ssl/certs/myroots.crt に配置されていたので symlink を作った。

おわり

これで QNAP 上で mackerel-agent を動かすことができるようになったはず。

あとは init スクリプトを書いたりしてデーモン化しておけばよい。

ディスク容量だけではなく netin/netout や CPU 使用状況も見れるので並列にコピーを走らせて無茶を走らせているときなど、余裕があるかなど見れて便利。

だいたい普通の Linux という感じでかなり手軽に運用できるので、次は nasne あたりも監視したい。