LoginSignup
20

More than 5 years have passed since last update.

Specinfra Host InventoryのデータをFluentdで集めてElasticsearchに入れてKibanaで見る構成管理

Last updated at Posted at 2015-03-04

前書き

@sawanoboly さんによるOhai版記事のSpecinfra Host Inventory版的なやつです。
踏襲したタイトル付けたらメッチャ長いタイトルになったw

何気なく軽量で実行方式(ローカルとかSSH越しとか)が選べて取り回しの良いインベントリ収集ライブラリは何かに使えるんじゃないかなーと思いつつ、ItamaeはChef Server的な存在が居ないし、こういう感じでインベントリを集めてみるのはどうでしょうかというコンセプトモデル的な何かです。

構成

Azureの無料枠が余っていたのでAzure上でやってみましたが、
慣れてないので複数のVMを纏めて扱うのが厳しそうだったので、
普通に大きめのVMをWEBコンソールから立てて、その中にDockerで複数の環境を構築しました。
es-specinfra1.png

詳細

構成方法

Chef,test-kitchenは言わずもがなかと思いますが、kitchen-docker_clikitchen-dockerへの不満から生まれた拙作のTest Kitchen Driverです。
SSHを排除するためにフルスクラッチで作っていて、Dockerネイティブな感じに使えるようにしており、kitchen-dockerにあるオプションから主観で必要そうな部分を抑えた上で、NW周りのオプション等を強化したりしています。
詳しく知りたい方はREADMEをお読みください。

.kitchen.ymlはこんな感じです。

---
driver:
  name: docker_cli

provisioner:
  name: chef_zero

platforms:
  - name: centos-6.6
  - name: fedora-20
  - name: ubuntu-14.04

suites:
  - name: elasticsearch
    driver_config:
      container_name: es
      publish: 5601:5601
      privileged: true
    excludes:
      - fedora-20
      - ubuntu-14.04
    run_list:
      - recipe[es-specinfra-example::elasticsearch]
  - name: fluentd01
    driver_config:
      link: es:es
    run_list:
      - recipe[es-specinfra-example::fluentd]
  - name: fluentd02
    driver_config:
      link: es:es
    run_list:
      - recipe[es-specinfra-example::fluentd]

実際に使用したCookbook等はこちらです。
https://github.com/marcy-cookbooks/es-specinfra-example

最近はTest-Kitchenが楽なのでカッチリやりたい時以外は大抵なんでもTest-Kitchenでやっちゃってます。

Elasticsearch + Kibana

余談ですが、Kibana4はElasticsearch1.4.4以降でしか動かないですが、公式Cookbookがattributeで0.9とか古いバージョンで固定されててアレでした。

2015/03/04追記:
attributeなので、自前Cookbook側で1.4.4に上書きするだけで、とりあえず動いています。

Elasticsearchは公式Cookbookでサービス登録してくれるので、Kibanaだけsupervisordで起動してます。
Kibana3はjsのみでデーモンいらずでしたが、Kibana4はSinatraアプリで起動スクリプトが同梱されてます)
稀にESの受け入れ体制が整う前にKibanaが起動してしまうのか、リトライアウトしてconvergeに失敗するのですが、本当に稀なので今回はスルーw

2015/03/05追記:
kibana4.0.1でESが起動していない場合にポーリングするよう修正されたそうなので、以降のバージョンであれば発生しないと思われます。

Fluentd

fluent-plugin-specinfra_inventoryは今回新しく作りました。
インベントリなんてそんなに頻繁に集めるものじゃないので、必ずしもFluentd Pluginじゃなくてよいという話もありますが、Outputが柔軟に変えられて良いというのと、Ohaiのもあるから良いかなとw

取得可能な全インベントリまたはインベントリを指定(複数可)して収集させます。
Ohaiもそうですが、Specinfraもデータは全てStringです。
このままだと不都合があるのでキャストするオプションも付けました。

設定ファイルはこんな感じです。

<source>
  type specinfra_inventory
  cast_num       true
  cast_byte      true
  cast_percent   true
  time_span 60
</source>
<match specinfra.inventory>
  type forest
  subtype elasticsearch
  <template>
    host es
    logstash_format true
    logstash_prefix fluentd-${hostname}
  </template>
</match>

このように、収集するインベントリのキーが指定されていない場合は、収集可能なインベントリの全てを収集します。
一部のみ取得したい場合は以下のように書きます。

<source>
  type specinfra_inventory
  inventory_keys ["platform", "hostname", "cpu.total"]
</source>

"cpu.total"のように.で区切るとネストされたHashの2階層目以降だけ取得することもできます。

動かしてみた

上記のFluentd設定のlogstash_prefixに準じたインデックスパターンを指定します。

kibana1.png

収集できてますね。

kibana2.png

例① ホスト数の遷移 
kibana4.PNG

例② platform(≒ディストリ)の割合とそれに属するホスト

kibana3.png

例③ ホストごとのCPUコア数(同一VM上にあるから全部同じw)
kibana6.png
余談ですが、--cpu-sharesとか--memory-limitとかのオプション付きで起動されたコンテナでコンテナ内から自身にかけられた制限の情報とかって知る方法無いんですかね?
使用できるメモリ容量から設定値を算出するCookbookとかあるので、取れると嬉しいのです。

または、これでやるのはどうなのかという話はありますが、監視っぽいこともできます。
例④ ホストごとの空きメモリの遷移(もっと色々あるけど、良い感じに線がバラけなかったw)

kibana5.png

例えばこんな構成も

Ohaiはローカルにインストールして叩きますが、SpecinfraBackendを切り替えてリモートから収集もできます。
なので、エージェント型と外部監視型を組み合わせたこんな構成も可能ですね。

es-specinfra2.png
※SSHは動作確認済み、WindowsはBackendは既にはあるけどHostInventoryの実装がまだ無い(2015.03.05現在)

最後に

SpecinfraのHost Inventoryは付加機能の一つであり、汎用コマンド実行フレームワークとして強力なプラットフォームの抽象化機構を持ちます。
その辺りを活かして、日々のオペレーションを助ける何かができないかなと思って色々弄ってみているのでした。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20