前書き
@sawanoboly さんによるOhai版記事のSpecinfra Host Inventory版的なやつです。
踏襲したタイトル付けたらメッチャ長いタイトルになったw
何気なく軽量で実行方式(ローカルとかSSH越しとか)が選べて取り回しの良いインベントリ収集ライブラリは何かに使えるんじゃないかなーと思いつつ、ItamaeはChef Server的な存在が居ないし、こういう感じでインベントリを集めてみるのはどうでしょうかというコンセプトモデル的な何かです。
構成
Azureの無料枠が余っていたのでAzure上でやってみましたが、
慣れてないので複数のVMを纏めて扱うのが厳しそうだったので、
普通に大きめのVMをWEBコンソールから立てて、その中にDockerで複数の環境を構築しました。
詳細
構成方法
Chef
,test-kitchen
は言わずもがなかと思いますが、kitchen-docker_cli
はkitchen-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
- Elasticsearch 1.4.4
- Kibana 4
余談ですが、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
- Fluentd 0.12.6
- fluent-plugin-forest 0.3.0
- fluent-plugin-elasticsearch 0.7.0
- fluent-plugin-specinfra_inventory 0.2.2
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
に準じたインデックスパターンを指定します。
収集できてますね。
例② platform
(≒ディストリ)の割合とそれに属するホスト
例③ ホストごとのCPUコア数(同一VM上にあるから全部同じw)
余談ですが、--cpu-shares
とか--memory-limit
とかのオプション付きで起動されたコンテナでコンテナ内から自身にかけられた制限の情報とかって知る方法無いんですかね?
使用できるメモリ容量から設定値を算出するCookbookとかあるので、取れると嬉しいのです。
または、これでやるのはどうなのかという話はありますが、監視っぽいこともできます。
例④ ホストごとの空きメモリの遷移(もっと色々あるけど、良い感じに線がバラけなかったw)
例えばこんな構成も
Ohai
はローカルにインストールして叩きますが、Specinfra
はBackend
を切り替えてリモートから収集もできます。
なので、エージェント型と外部監視型を組み合わせたこんな構成も可能ですね。
※SSHは動作確認済み、WindowsはBackendは既にはあるけどHostInventoryの実装がまだ無い(2015.03.05現在)
最後に
SpecinfraのHost Inventoryは付加機能の一つであり、汎用コマンド実行フレームワークとして強力なプラットフォームの抽象化機構を持ちます。
その辺りを活かして、日々のオペレーションを助ける何かができないかなと思って色々弄ってみているのでした。