Nagios - APIない、コンフィグ生成して配るとかになりがち
Zabbix - エンタープライズ、zabbix proxyで中央集権+エージェント的な構成とれるが、中央集約するzabbix重くなる
Sensuいいところ
- エージェント型, Blue Greenデプロイ、immutable infrastructure向き, コンフィグ生成とか登録とか不要らしい。
- エージェントが参加してくるモデル
http://sensuapp.org/docs/0.12/
- ノードで
checks
スクリプトを実行し結果を1つまたは複数のhandlerに伝える - handler は checksの結果を使ってなんらかアクションするもの
- STDINをJSON.parseしてなんらかアクションするもの
- pipe
- TCP イベントデータをTCP socketに書き込む
- fluentcatと同じ
- AMQP queueにeventを突っ込む
- set = handlerをグループ化したもの。
severities
でevent levelをフィルタできる
checks
とはSTDOUT,STDERRを出力しexit codeは0(OK),1(WARNING),2(CRITICAL), 3(UNKNOWN or CUSTOM), nagiosとコンパチブル
procs = `ps aux`
running = false
procs.each_line do |proc|
running = true if proc.include?('chef-client')
end
if running
puts 'OK - Chef client daemon is running'
exit 0
else
puts 'WARNING - Chef client daemon is NOT running'
exit 1
end
checks definition
{
"checks": {
"chef_client": {
"command": "check-chef-client.rb",
"subscribers": [
"production"
],
"interval": 60
}
}
}
- イベントはデフォルトでは、
default
というhandlerに渡される、指定しない限りは。
checks definition with handlers
{
"checks": {
"chef_client": {
"command": "check-chef-client.rb",
"subscribers": [
"production"
],
"interval": 60,
"handlers": [
"pagerduty",
"irc"
]
}
}
}
-
これで、イベントがircやpagerdutyへ伝搬する
-
"handle": false
でhandlerへの伝搬を無効にできる -
subdue
で時間指定でhandlerへの伝搬を無効にできる
"subdue": {
"begin": "5PM PST",
"end": "9AM PST"
}
-
dependencies で依存関係を書くことで、1つのエラーによる他のエラーのhandlingを抑制できる
-
standalone checks
-
check command token substitution
-
コマンドに変数を渡せる
{
"checks": {
"chef_client": {
"command": "check-mysql-replication.rb --user :::mysql.user::: --password :::mysql.password:::",
"subscribers": [
"mysql"
],
"interval": 60
}
}
}
- flap detection
そのた
- プラッピング対策機能
##インストール
いきなりChefでやるとつかめないので、手動インストールやる
rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
yum install erlang
rpm --import http://www.rabbitmq.com/rabbitmq-signing-key-public.asc
rpm -Uvh http://www.rabbitmq.com/releases/rabbitmq-server/v3.2.1/rabbitmq-server-3.2.1-1.noarch.rpm
chkconfig rabbitmq-server on
/etc/init.d/rabbitmq-server start
mkdir -p /etc/rabbitmq/ssl
cp /tmp/ssl_certs/sensu_ca/cacert.pem /etc/rabbitmq/ssl/
cp /tmp/ssl_certs/server/cert.pem /etc/rabbitmq/ssl/
cp /tmp/ssl_certs/server/key.pem /etc/rabbitmq/ssl/
/etcrabbitmq/rabbitmq.config
設定書き換えた
[
{rabbit, [
{ssl_listeners, [5671]},
{ssl_options, [{cacertfile,"/etc/rabbitmq/ssl/cacert.pem"},
{certfile,"/etc/rabbitmq/ssl/cert.pem"},
{keyfile,"/etc/rabbitmq/ssl/key.pem"},
{verify,verify_peer},
{fail_if_no_peer_cert,true}]}
]}
].
確認してみた
netstat -anp | grep 5671
tcp 0 0 :::5671 :::* LISTEN 2626/beam.smp
rabbitmq再起動する
/etc/init.d/rabbitmq-server restart
rabbitmqでvhost作る
rabbitmqctl add_vhost /sensu
rabbitmq user作る
rabbitmqctl add_user sensu mypass
rabbitmqctl set_permissions -p /sensu sensu ".*" ".*" ".*"
pluginを操作
rabbitmq-plugins enable rabbitmq_management
再起動
/etc/init.d/rabbitmq-server restart
yum install redis
rabbitmqとredis以外の、必要なパッケージをオールインワンでインストールする
/etc/yum.repos.d/sensu.repo
[sensu]
name=sensu-main
baseurl=http://repos.sensuapp.org/yum/el/$releasever/$basearch/
gpgcheck=0
enabled=1
yum install sensu
RabbitMQとSSLで通信するための設定
作成したキーをsensuに置く(agent monitor両方)
mkdir -p /etc/sensu/ssl
cp /tmp/ssl_certs/client/cert.pem /etc/sensu/ssl/
cp /tmp/ssl_certs/client/key.pem /etc/sensu/ssl/
/etc/sensu/conf.d/rabbitmq.json (monitor)
{
"rabbitmq": {
"ssl": {
"cert_chain_file": "/etc/sensu/ssl/cert.pem",
"private_key_file": "/etc/sensu/ssl/key.pem"
},
"host": "127.0.0.1",
"port": 5671,
"vhost": "/sensu",
"user": "sensu",
"password": "mypass"
}
}
/etc/sensu/conf.d/rabbitmq.json (monitor)
{
"rabbitmq": {
"ssl": {
"cert_chain_file": "/etc/sensu/ssl/cert.pem",
"private_key_file": "/etc/sensu/ssl/key.pem"
},
"host": "192.168.33.10"
"port": 5671,
"vhost": "/sensu",
"user": "sensu",
"password": "mypass"
}
}
/etc/sensu/conf.d/redis.json (monitor)
monitor serverはRedisと通信するので以下の設定をする(monitor)
{
"redis": {
"host": "localhost",
"port": 6379
}
}
monitor serverはSensu APIとdashboardを動かすので、次を設定する
On the “monitor” system, create/edit /etc/sensu/conf.d/api.json.
{
"api": {
"host": "localhost",
"port": 4567,
"user": "admin",
"password": "secret"
}
}
On the “monitor” system, create/edit /etc/sensu/conf.d/dashboard.json.
{
"dashboard": {
"port": 8080,
"user": "admin",
"password": "secret"
}
}
sensu-clientの定義情報を書く(monitor agent両方) nameはhostnameとかvm idとかにする On both systems, create/edit /etc/sensu/conf.d/client.json.
{
"client": {
"name": "SUBSTITUTE_ME",
"address": "SUBSTITUTE_ME",
"subscriptions": [ "all" ]
}
}
サービス起動(monitor)
chkconfig sensu-server on
chkconfig sensu-client on
chkconfig sensu-api on
chkconfig sensu-dashboard on
サービス起動(agent)
chkconfig sensu-client on
Start Sensu services
On the “monitor” system, start all of the Sensu components.
/etc/init.d/sensu-server start
/etc/init.d/sensu-client start
/etc/init.d/sensu-api start
/etc/init.d/sensu-dashboard start
On the “agent” system, start the Sensu client.
/etc/init.d/sensu-client start
動いた
この時点のディレクトリ
[root@monitor vagrant]# find /etc/sensu/
/etc/sensu/
/etc/sensu/plugins
/etc/sensu/handlers
/etc/sensu/mutators
/etc/sensu/extensions
/etc/sensu/ssl
/etc/sensu/ssl/cert.pem
/etc/sensu/ssl/key.pem
/etc/sensu/config.json.example
/etc/sensu/conf.d
/etc/sensu/conf.d/rabbitmq.json
/etc/sensu/conf.d/client.json
/etc/sensu/conf.d/README.md
/etc/sensu/conf.d/api.json
/etc/sensu/conf.d/dashboard.json
[root@agent vagrant]# find /etc/sensu/conf.d/
/etc/sensu/conf.d/
/etc/sensu/conf.d/rabbitmq.json
/etc/sensu/conf.d/client.json
/etc/sensu/conf.d/README.md
crondのプロセス監視
sensu-plugin は既に以下に入っていた
[root@monitor vagrant]# ls /opt/sensu/embedded/lib/ruby/gems/2.0.0/gems/sensu-plugin-0.2.2/
ちなみに、sensuのrubyは2.0.0だった。rpmに含まれている
# /opt/sensu/embedded/bin/ruby -v
ruby 2.0.0p353 (2013-11-22 revision 43784) [x86_64-linux]
note https://github.com/sensu/sensu-plugin
sensu-plugin gemはプラグインを書くためのフレームワークを提供。プラグイン書くために必ずsensu-pluginが必要というわけではないが、あるとrubyスクリプトだと便利。
require 'sensu-plugin/check/cli'
class MyCheck < Sensu::Plugin::Check::CLI
check_name 'my_awesome_check' # defaults to class name
option :foo, :short => '-f' # Mixlib::CLI is included
def run
ok "All is well"
end
end
プラグインを入れる
wget -O /etc/sensu/plugins/check-procs.rb https://raw.github.com/sensu/sensu-community-plugins/master/plugins/processes/check-procs.rb
chmod 755 /etc/sensu/plugins/check-procs.rb
以下をmonitorサーバに入れる
{
"checks": {
"cron_check": {
"handlers": ["default"],
"command": "/etc/sensu/plugins/check-procs.rb -p crond -C 1 ",
"interval": 60,
"subscribers": [ "webservers" ]
}
}
}
webserversチャネルをサブスクライブするクライアントではこの監視が実行されるようになる。
クライアント側でwebserversチャネルをサブスクライブしてみる
{
"client": {
"name": "agent",
"address": "agent",
"subscriptions": [ "webservers" ]
}
}
monitor, agentそれぞれsensuをrestartする
あれ、
{"timestamp":"2014-01-13T05:41:10.290802+0000","level":"info","message":"publishing check result","payload":{"client":"agent","check":{"name":"cron_check","issued":1389591670,"command":"/etc/sensu/plugins/check-procs.rb -p crond -C 1 ","executed":1389591670,"output":"/usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require': no such file to load -- sensu-plugin/check/cli (LoadError)\n\tfrom /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'\n\tfrom /etc/sensu/plugins/check-procs.rb:29\n","status":1,"duration":0.048}}}
forkするから同じRubyのコードでもシステムのrubyを見るようだ(こういうもの??)
gem install sensu-plugin --no-rdoc --no-ri
How can I use the Sensu embedded Ruby for checks and handlers?
You can use the embedded Ruby by setting EMBEDDED_RUBY=true in /etc/default/sensu. The Sensu init scripts will set PATH and GEM_PATH appropriately.
動いた
{"timestamp":"2014-01-13T05:43:57.494331+0000","level":"info","message":"publishing check result","payload":{"client":"agent","check":{"name":"cron_check","issued":1389591837,"command":"/etc/sensu/plugins/check-procs.rb -p crond -C 1 ","executed":1389591837,"output":"CheckProcs CRITICAL: Found 0 matching processes; cmd /crond/\n","status":2,"duration":0.078}}}
{"timestamp":"2014-01-13T05:51:57.458170+0000","level":"info","message":"publishing check result","payload":{"client":"agent","check":{"name":"cron_check","issued":1389592317,"command":"/etc/sensu/plugins/check-procs.rb -p crond -C 1 ","executed":1389592317,"output":"CheckProcs OK: Found 1 matching processes; cmd /crond/\n","status":0,"duration":0.07199999999999999}}}
飛ばす
飛ばす
- handlerはsensu server 上で動作する
- handlerはclientで実行されたcheckイベントを受け取る
サーバで
"handlers": {
"email": {
"type": "pipe",
"command": "mail -s 'sensu alert' your@address"
}
}
}
- serverとclientとの間の接続性チェックのためのカスタムなchecks
- clientは定期的にserverにstatusを送りkeepaliveする
- 閾値を超えるとイベントが発生する
- デフォルトでは
default
handlerに渡される。180秒の後criticalイベント発生 - クライアントごとにカスタマイズも可能。閾値とかhandlerとか。メールに飛ばすとかも可能
消さずにclientを落とすとkeepalive downのイベントが起きる
2つの方法がある
- Using API
$ curl -X DELETE http://admin:secret@localhost:4567/client/<node>
{"issued":1389595354}
- Dashboard上から消す
ちなみに消してもsensu-clientが動いていたらエントリはまた復活(追加)されるので、ホストを止めてからkeepalive timeoutまでにAPI叩いて消す感じっぽい
Yes. You can run as many Sensu servers as you require. Check results are distributed to Sensu servers in a round-robin fashion, allowing you to scale out. Running more that one Sensu server is recommended.
The Sensu server master is responsible for check request publishing. Master election is automatic, and so is failover. No configuration is required.