Ansibleでshinkenを入れてみたものの、そんな簡単に監視設定が終わるわけなかった

Posted on 2014/06/20(Fri) 22:15 in technical

さまりっか

対お姉ちゃん用監視部隊、通称Shinken隊の話をしようじゃないか。

一応先に結論から言っておくと、対お姉ちゃん用監視部隊としても普通の監視ツールとしても決して使い勝手はよくありません。

Shinken is 何

真剣?マジなの?おこなの?

Python製の監視フレームワークちゃんです。

  • WebUIおよび切り替え機能付(Thruk, MK Multisite, NagVis or PNP)
  • カスタマイズダッシュボード有り
  • 影響度可視化画面有り
  • nagios互換(ダウンタイム設定とかもある)
  • HA機能有り
  • pnp4nagios/Graphite連携可
  • DBは割と選べる(MySQL, Oracle, MsSQL, MongoDB, etc...) ...とまぁ色々だ。

使い込むのは後にして、いんすとーる&ふぁーすといんぷれっしょん。

構成

トポロジ:

| Ansible | --- | SW | --- | Shinken |

両方ともこれ:

$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04 LTS"

Ansible自体の準備は前の時と同じ。

インストール

今回のAnsibleクッキングでは、次の要素が組み込まれます。

  • shinken2系(pip経由。WebUIはpython直なので、apache,nginx等は現時点では含まれません)
  • localhostを監視するlinux-sshプラグイン(要python-paramiko)
  • ダッシュボード表示用のsqlite

コンポーネント依存も少なくて案外小さいじゃないですかー(CV.遥そら)

警告

そう、入れるプラグイン次第でコンポーネント依存はどんどん拡大の一途を辿るのである。ただし胸は大きくならない。

2系と1系があったら最新版を入れたいじゃないですかー(CV.遥そら)

通報

Ubuntu 14.04はaptでshinkenを入れられるんだけど、pip経由で2系を入れます。

私ってどっちかっていうと可愛い系じゃないですかー(CV.遥そら)

備考

可愛い。

光の速さでインストール:

$ git clone https://github.com/ainoniwa/ansible-playbooks.git
$ cd ansible-playbooks
$ git checkout a9cc4b0e32
$ cd shinken
$ echo "192.168.122.143" > hosts
$ ansible-playbook main.yml -i hosts -k -K
SSH password:
sudo password [defaults to SSH password]:

PLAY [all] ********************************************************************

<中略>

PLAY RECAP ********************************************************************
192.168.122.143            : ok=18   changed=16   unreachable=0    failed=0

警告

今後、構造等の大きな変更が加わった際に、本文書の修正を回避するために`git checkout`が実施されていますが、基本的には不要のはずです。

説明はPlaybookに任せる(説明を端折るための横着)

実際、下記URLの内容がPlaybookになってるだけです。

で、この場合で言うと http://192.168.122.143:7767/ にアクセスすると、インストールされたShinkenの画面を見ることができると思いますが...どうですかねぇ。

shinken_ansible_001.png

外観

ログイン画面。

shinken_ansible_002.png

admin/adminでログインできます。

デフォルトなので、変更時はこちらのcontact_name,passwordを変更する:

$ cat /etc/shinken/contacts/admin.cfg
# This is a default admin
# CHANGE ITS PASSWORD!

define contact{
    use             generic-contact
    contact_name    admin
    email           shinken@localhost
    pager           0600000000   ; contact phone number
    password        admin
    is_admin        1
}

ログインすると、IT Problemsのページに飛ぶ。

shinken_ansible_003.png

上のバーからAll画面に移動するとこんな感じ。綺麗。

shinken_ansible_004.png

右端の下矢印をクリックすると、ちょっと広がる(でもそれほど情報量は増えない)

shinken_ansible_005.png

localhostをクリックすると、localhost全体のページに遷移する。

shinken_ansible_006.png

そこから、Servicesに画面遷移すると、そのホストの監視対象ツリーを見ることができる。 このツリーはImpact graphを書くときの監視階層に関係している。

shinken_ansible_007.png

右端のImpact graphに画面遷移すると、監視対象の状態ツリーを確認することができる。

shinken_ansible_008.png

localhostの左側に伸びている/systemをクリックすると、トポロジが変形して健常度合を見ることができる。(さらにホイールスクロールで拡大縮小が可能だ)

shinken_ansible_009.png

上のバーのSystemからShinken Stateを選べば、各デーモンの状態を見ることができる(...っていうかデーモン多くね?)

shinken_ansible_010.png

更に、ダッシュボードにアクセスすると最初は何もない。

shinken_ansible_011.png

で、「+ Add a new Widget」をクリックすると、 右側に選択肢が出るので適当にRelation graphとSystem stateを追加して、適当に並べてみるとこんな感じになる。

shinken_ansible_012.png

Editボタンを押すと、対象を変更できる(今はlocalhostしかいないけど)ので、対象のホストを選択して表示することができる。

shinken_ansible_013.png

更に、Currently(右上の交差している矢印っぽいやつ)をクリックすると、良い感じに監視してる風の画面が出る。

shinken_ansible_014.png

この画面を一日中眺めて、赤くなったら仕事をしよう(提案)

さて。

流石に監視サーバ自身だけ監視してもしょうがない。監視対象を追加したりしないといけないだろう。

設定を追加したり変更したりするにはどこの設定ファイルを触ればいいのかな?

多分 /etc/shinken の中見ればわかるよね?:

$ ls /etc/shinken/
arbiters       daemons       hosts             realms      servicegroups
brokers        dependencies  modules           receivers   services
certs          dev.cfg       notificationways  resource.d  shinken.cfg
commands       discovery     packs             sample      templates
contactgroups  escalations   pollers           sample.cfg  timeperiods
contacts       hostgroups    reactionners      schedulers

Wow...ファイルガ オオクテ ヨクワカリマセーン...。

アーキテクチャ見よう

ファイルが多くて良く分からないのは、アーキテクチャをよく知らないからだ。構成を知ろう。

既に心が折れそうだなぁ。

shinkenは主に下記の6つの要素(内1つはオプション)で構成されます。 負荷分散を考慮しているため、個々の要素はそれぞれ異なるノードにインストールしてスケールすることが可能です。

  • Arbiter
    • 設定ファイルを読み込んで、対応するデーモンに配布するやつ
    • 配布先のデーモンが死んだら別のデーモンに配布しなおす高可用性を管理する
    • Livestatus APIとかnagios.cmdでユーザが叩いたコマンドを、適切なデーモンにルーティングする入口の役割を持ちます
  • Scheduler
    • pollerとreactionnerに処理を割り当てるやつ
    • 実際の処理はしないけど、チェック結果を一時的に受け取ってプールする
  • Poller
    • 能動的にチェックプラグインを起動するやつ
  • Reactionner
    • チェックプラグインの結果から、メールを投げたりRSS通知をしたりする
    • Shinken以外の外部システムに対して能動的に働きかける処理を一元化している
  • Brocker
    • Schedulerから受け取ったチェックプラグインの実データの処理を決定するやつ
    • 監視結果、リソース値、ログをデータとして出力する部分
    • WebUIはこいつを介してデータにアクセスするので、WebUIプラグインはこいつが管理する
  • Receiver(optional)
    • 受動的にチェック結果を受け取るやつ
    • NSCA daemon(nagiosでSNMP Trapを受け取って処理するやつ)とかはここに分類される

公式の出してる画像が割と綺麗です。が、若干ふんわりしています。

http://www.shinken-monitoring.org/wiki/the_shinken_architecture

まぁ、流れはこんな感じで良いんじゃないかな。

  1. 設定ファイル読んで設定配る(Arbiter)
  2. スケジューラ(Scheduler)
  3. チェックプラグイン(nagiosプラグインとか)動かす(Poller)
  4. スケジューラ(Scheduler)
  5. データためる(Brocker)
  6. Webアクセスするプラグインを管理してるやつが立ってる(Brocker) <- ここにWebアクセスしてデータ見る

ノードの追加

今回使っているのはlinux-sshプラグインで、監視項目はデフォルトでこんな感じ:

$ cat /etc/shinken/packs/linux-ssh/commands.cfg | grep name
       command_name     check_ssh_connexion
       command_name     check_ssh_linux_memory
       command_name     check_ssh_linux_cpu_stats
       command_name     check_ssh_linux_disks
       command_name     check_ssh_linux_disks_stats
       command_name     check_ssh_linux_kernel_stats
       command_name     check_ssh_linux_load_average
       command_name     check_ssh_linux_processes
       command_name     check_ssh_linux_tcp_states
       command_name     check_ssh_linux_net_stats
       command_name     check_ssh_ro_filesystem
       command_name     check_ssh_linux_uptime
       command_name    check_ssh_linux_ntp_sync
       command_name    check_ssh_linux_ntp_sync_chrony
       command_name     check_ssh_linux_nfs_stats

_statsがついてるものがリソース測定用で、そうでないものがプロセス監視用ぽい。

shinkenのWebUIからはノード追加用の設定は出来ないので、こんな感じで追加します。

linux-sshはsshログインが必須なので公開鍵登録をして、設定ファイルを書きます:

# su - shinken
$ ssh-copy-id -i ~/.ssh/id_rsa.pub test@192.168.122.149
$ echo "define host{
        use                     linux-ssh,generic-host
        contact_groups          admins
        host_name               test
        address                 192.168.122.149
        _SSH_USER               test
        }" > /etc/shinken/hosts/test.cfg
$ exit
# service shinken-arbiter restart

備考

  • アクセス先にtestユーザがいると仮定しています。ここは適切な(ログインしてコマンド操作が可能な)ユーザに読み替えてください
  • Arbiterだけを再起動すれば、設定ファイルの変更は適用されます(アーキテクチャの通り)
  • _SSH_USERなどの変数は、例えばlinux-sshを使用する場合は /etc/shinken/packs/linux-ssh/templates.cfg で定義されています。
  • shinkenユーザの公開鍵はインストール時にplaybookに書いておいたから、最初から使えるよ!やったね!

これで新しいホストが追加されて、監視がスタートします。

shinken_ansible_015.png

これで監視ノードが増えた時、どうやってカタカタすれば良いかは分かった。

チェックプラグインの追加

警告

現時点ではかなりつらいです。色々と。

linux-sshしか使えないのもあれだし、SNMPのチェックとかしたくなったらどうすればいいんだろう。

あ、それ linux-snmp を入れれば良さそう。:

# su - shinken
$ shinken install linux-snmp
$ ls /etc/shinken/packs/linux-snmp/
commands.cfg  discovery.cfg  linux-snmp.pack  services  templates.cfg
$ cat /etc/shinken/resource.d/snmp.cfg
# default snmp community
$SNMPCOMMUNITYREAD$=public

通報

shinken search all とかすると、対応しているプラグインがだばーっと出ます。vmwareとかwindowsとかciscoとかhpとか色々あるっぽいです。

ふむふむ。さっきと同じパターンで、監視ホストに設定を入れればいいんだな。

COMMUNITYはとりあえずpublicらしいので動作確認しておこう。

で、チェックプラグインを起動して:

$ /var/lib/shinken/libexec/check_snmp_load.pl
Can't locate Net/SNMP.pm in @INC (you may need to install the Net::SNMP module) (@INC contains: /etc/perl /usr/local/lib/perl/5.18.2 /usr/local/share/perl/5.18.2 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.18 /usr/share/perl/5.18 /usr/local/lib/site_perl .) at /var/lib/shinken/libexec/check_snmp_load.pl line 16.
BEGIN failed--compilation aborted at /var/lib/shinken/libexec/check_snmp_load.pl line 16.

Oh...。

どうせnagiosプラグインに関するものは必要になるので、とりあえず一式入れとく。:

# apt-get install nagios-plugins
$ /var/lib/shinken/libexec/check_snmp_load.pl
Can't locate utils.pm in @INC (you may need to install the utils module) (@INC contains: /usr/local/nagios/plugins /etc/perl /usr/local/lib/perl/5.18.2 /usr/local/share/perl/5.18.2 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.18 /usr/share/perl/5.18 /usr/local/lib/site_perl .) at /var/lib/shinken/libexec/check_snmp_load.pl line 22.
BEGIN failed--compilation aborted at /var/lib/shinken/libexec/check_snmp_load.pl line 22.

何だよもう!更にプラグインにパスを追加して動作確認:

$ grep -n "lib" /var/lib/shinken/libexec/check_snmp_load.pl
21:use lib "/var/lib/shinken/libexec";
22:use lib "/usr/lib/nagios/plugins";
$ /var/lib/shinken/libexec/check_snmp_load.pl
Usage: /var/lib/shinken/libexec/check_snmp_load.pl [-v] -H <host> -C <snmp_community> [-2] | (-l login -x passwd [-X pass -L <authp>,<privp>])  [-p <port>] -w <warn level> -c <crit level> -T=[stand|netsl|netsc|as400|cisco|cata|nsc|fg|bc|nokia|hp|lp|hpux] [-f] [-t <timeout>] [-V]
$ /var/lib/shinken/libexec/check_snmp_load.pl -H 192.168.122.156 -C public -w 90 -c 95
Argument "v6.0.1" isn't numeric in numeric lt (<) at /var/lib/shinken/libexec/check_snmp_load.pl line 686.
Can't find CPU usage information : UNKNOWN

通報

これに関してはログ取った時は出たんだけど、今は出ないかもしれません。

またか...決してShinkenが悪いわけではないと思うのだが、もう既に調査だけでお腹一杯になってる。

いや待て、パッケージングされたスクリプトが修正しないと動かないの、Shinkenが悪いだろ。:

$ sed -i 's/Net::SNMP->VERSION < 4/Net::SNMP->VERSION lt 4/g' /var/lib/shinken/libexec/check_snmp_load.pl
$ /var/lib/shinken/libexec/check_snmp_load.pl -H 192.168.56.15 -C public -w 90 -c 95
1 CPU, load 1.0% < 90% : OK

通報

check_snmp_mem.pl, check_snmp_storage.plも同様に対応する。

これでプラグインの一部は動くことが確認できた。

後は、さっきと同様に設定を変更して再起動。:

# su - shinken
$ echo "define host{
        use                     linux-snmp,generic-host
        contact_groups          admins
        host_name               test
        address                 192.168.122.149
        }" > /etc/shinken/hosts/test.cfg
$ exit
# service shinken-arbiter restart

通報

192.168.122.149ではCOMMUNITYがpublicでSNMPアクセスできるという設定です。

動いた。

shinken_ansible_016.png

何でUNKNOWNなんですか!値取れてるじゃないですか!もう!

割に合わねぇ。

通報

ちなみに、プラグインの動作に必要な対応は、大体ここに書いてある通りでした。 https://wiki.icinga.org/display/howtos/check_snmp

localhostの時は表示されなかったけど、SNMPを使っていると、ホストの画面で見た目が無駄にカッコいいリソースダイアグラムを見ることができます。

カッコいい(真顔)

shinken_ansible_017.png

っていうか Warning: This plugin must be either run as root or setuid root. ってなんだよ!SNMPプラグインだぞちょっと待てよ!

ま、それはさておき。

新しくMIBを指定して監視するには、

  1. /etc/shinken/packs/linux-snmp/services/ で .cfg を書く
  2. /etc/shinken/packs/linux-snmp/command.cfg にコマンドを定義する

の順で設定可能だと思うのだが、見る限りSNMPを手厚くする気が無いように見えるんですよね。:

$ ls -l /var/lib/shinken/libexec/*snmp*
-rwxr-xr-x 1 shinken shinken 22955 Jun 20 21:47 /var/lib/shinken/libexec/check_snmp_load.pl
-rwxr-xr-x 1 shinken shinken 18673 Jun 20 21:47 /var/lib/shinken/libexec/check_snmp_mem.pl
-rwxr-xr-x 1 shinken shinken 23965 Jun 20 21:47 /var/lib/shinken/libexec/check_snmp_storage.pl

nagios-plugins入れたんだから、 /usr/lib/nagios/plugins/check_snmp でも使えば?と言うことですか。そんな馬鹿な。

っていうか全編通して設定が非常に面倒なんですけど、これどうにかならないんですか...Livestatus APIでも入れたら楽になるんですか...?

グラフ欲しい!んだけど...

「グラフが無いとか耐えられない!」からの「耐えて別のリソースグラフツール探すか」の流れ。

ヤバい、無限に調査範囲が広がるし、割とどこに着地できない、ヤバい。

あぁ、Shinkenはグラフツール(Graphite/PNP4Nagios)との連携ができるんですよ。

ただその、ちょっと疲れてしまって。

気が向いたらグラフ連携も書きましょうね。

そうだね、向きそうにないね。

もう終わりにしよう

自宅ラボライフを快適にするには、監視を簡単かつ的確に設定できる必要があることは言うまでもない。自動的に監視が始まろうもんならお昼寝生活待ったなしですよ。

一応Shinkenと呼ばれる監視ソフトウェアも抑えておく必要があるかと思って、割とちゃんと調査しようと思っていたんですよ。

あー...途中までは。

確かに見た目は割と良いし、インストール自体はそう難しくもないし、プラグインをshinken.ioが配ってるってのは良いと思うんですよ。

でもちょっとそれ以外がつらい。全体的につらい。

恐らくこれならZabbixやCentreonやPandoraFMSと向き合った方が良い。

とりあえずはこんなところで幕引きにしたい。

僕がベストプラクティスに沿ってないからだとか、もっとちゃんと調査したいという人は是非よろしくお願い致します。