Skip to content

Instantly share code, notes, and snippets.

@nikushi
Last active December 23, 2015 10:18
Show Gist options
  • Save nikushi/9800859 to your computer and use it in GitHub Desktop.
Save nikushi/9800859 to your computer and use it in GitHub Desktop.
20140113 ヒカリエハッカソンでSensu触ったメモ

Sensu

Sensuやりたかった理由

Nagios - APIない、コンフィグ生成して配るとかになりがち
Zabbix - エンタープライズ、zabbix proxyで中央集権+エージェント的な構成とれるが、中央集約するzabbix重くなる

Sensuいいところ

  • エージェント型, Blue Greenデプロイ、immutable infrastructure向き, コンフィグ生成とか登録とか不要らしい。
  • エージェントが参加してくるモデル

Sensuapp.orgを読む

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 ?

  • 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でやるとつかめないので、手動インストールやる

RabbitMQ

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

Install ssl cert

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

Redis

yum install redis

Sensu packagesのインストール(agent monitor両方)

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

sensu connectionの設定(agent monitor 両方)

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

embeded rubyも使えるっぽい

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}}}

standalone mode

飛ばす

metrics

飛ばす

add a sensu handler

  • handlerはsensu server 上で動作する
  • handlerはclientで実行されたcheckイベントを受け取る

サーバで

  "handlers": {
    "email": {
      "type": "pipe",
      "command": "mail -s 'sensu alert' your@address"
    }
  }
}

keepalives

  • serverとclientとの間の接続性チェックのためのカスタムなchecks
  • clientは定期的にserverにstatusを送りkeepaliveする
  • 閾値を超えるとイベントが発生する
  • デフォルトでは default handlerに渡される。180秒の後criticalイベント発生
  • クライアントごとにカスタマイズも可能。閾値とかhandlerとか。メールに飛ばすとかも可能

clientをserver上から消す方法

消さずにclientを落とすとkeepalive downのイベントが起きる

2つの方法がある

  1. Using API
$ curl -X DELETE http://admin:secret@localhost:4567/client/<node>
{"issued":1389595354}
  1. Dashboard上から消す

ちなみに消してもsensu-clientが動いていたらエントリはまた復活(追加)されるので、ホストを止めてからkeepalive timeoutまでにAPI叩いて消す感じっぽい

Can I run multiple Sensu servers?

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.

When I have multiple Sensu servers, which one will be the master?

The Sensu server master is responsible for check request publishing. Master election is automatic, and so is failover. No configuration is required.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment