ChefからDockerコンテナにSensu Clientをインストールする
前回、ChefからDockerコンテナにSensu Serverをインストールすることができました。そこで、今回はChefからDockerコンテナにSensu Clientをインストールして、Dockerコンテナが自動的に監視対象として追加されるか試してみました。
また、Clientの監視定義として、CPU使用率監視、メモリ使用率監視、ログ監視が設定されるようにしてみました。
Dockerコンテナ
前回作成したDockerコンテナを使用します。
Sensu ClientのChefレシピ
それでは、Sensu Clientをインストーするレシピについて見ていきます。
cookbookの構成
cookbookの構成は以下の通りです。
site-cookbook
└──sensu-client
└──recipes
│ └──default.rb
└──templates
└──default
├──client.json.erb ... Sensu Clientの監視定義ファイル
├──config.json.erb ... Sensu Serverの定義ファイル
├──sensu.list.erb ... リポジトリの定義ファイル
└──sensu-client.conf.erb ... supervisorの定義ファイル
recipesファイル
recipesファイルは以下の通りです。
$ vi site-cookbooks/sensu-client/recipes/default.rb
%w{wget}.each do | pkg |
package pkg do
action :install
end
end
template "/etc/apt/sources.list.d/sensu.list" do
owner "root"
mode 0644
source "sensu.list.erb"
end
bash "add sensu repos" do
code "wget -q http://repos.sensuapp.org/apt/pubkey.gpg -O- | apt-key add -"
action :run
end
bash "apt-get update" do
code "apt-get update"
action :run
end
%w{sensu git-core bc rsyslog}.each do | pkg |
package pkg do
action :install
end
end
git "/tmp/sensu_plugins" do
repository "git://github.com/sensu/sensu-community-plugins.git"
reference "master"
action :sync
end
bash "copy sensu plugins" do
code "cp -Rf /tmp/sensu_plugins/plugins /etc/sensu/"
action :run
end
bash "chmod sensu plugins" do
code "find /etc/sensu/plugins/ -name *.rb -exec chmod +x {} \\;"
action :run
end
template "sensu-client.conf" do
path "/etc/supervisor/conf.d/sensu-client.conf"
owner "root"
group "root"
mode "0644"
source "sensu-client.conf.erb"
end
template "config.json" do
path "/etc/sensu/config.json"
owner "root"
group "root"
mode "0644"
source "config.json.erb"
end
template "client.json" do
path "/etc/sensu/conf.d/client.json"
owner "root"
group "root"
mode "0644"
source "client.json.erb"
end
bash "ln ruby path" do
code "ln -s /opt/sensu/embedded/bin/ruby /usr/bin/ruby"
action :run
end
bash "supervisorctl reload" do
code "supervisorctl reload"
action :run
end
templateファイル
templateファイルは以下の通りです。
client.json
client.jsonは監視対象の情報や監視定義を設定するファイルであり、Sensu Client側に配置します。
checks_*.jsonの"subscribers"に定義した名称をsubscriptionsに指定することで、監視定義を設定することができます。
"sensu"はSensu Server用にしているので、"default"のみを設定します。
$ vi site-cookbooks/sensu-client/templates/default/client.json.erb
{
"client": {
"name": "sensu-client",
"address": "127.0.0.1",
"subscriptions": [ "default" ]
}
}
config.json
config.jsonは接続先のSensu Serverの定義ファイルになります。
"rabbitmq"には、追加したユーザ名を指定しています。
$ vi site-cookbooks/sensu-client/templates/default/config.json.erb
{
"rabbitmq": {
"port": 5672,
"host": "<IPアドレス>",
"user": "admin",
"password": "admin",
"vhost": "/"
}
}
sensu.list
sensu.listには、Sensuのリポジトリを指定しています。
$ vi site-cookbooks/sensu-client/templates/default/sensu.list.erb deb http://repos.sensuapp.org/apt sensu main
sensu-client.conf
sensu-client.confには、supervisorからSensu Clientを起動する設定をしています。
シスログ監視のサンプルのため、rsyslogの起動も設定しています。
$ vi site-cookbooks/sensu-client/templates/default/sensu-client.conf.erb [program:sensu-client] priority=40 directory=/tmp command=/opt/sensu/bin/sensu-client -c /etc/sensu/config.json -d /etc/sensu -e /etc/sensu/extensions -v -l /var/log/sensu/client.log user=root autostart=true autorestart=true [program:rsyslogd] command=/usr/sbin/rsyslogd autostart=true autorestart=true
Chefレシピの実行
Dockerコンテナを起動します。
22のポートを外部からアクセスできるようにしておきます。
$ sudo docker run -d -p 22 ubuntu-supervisor:12.04 $ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 365a226d1a9d ubuntu-supervisor:12.04 supervisord -n 3 days ago Up 3 days 0.0.0.0:[ポート番号]->22/tcp high_elion
Sensu ClientのChefレシピを流します。
Chefを実行する時は、22番ポートにフォワードされているポート番号を指定します。
$ vi nodes/<IPアドレス>.json
{
"run_list": [
"recipe[sensu-client]"
]
}
$ knife solo bootstrap root@<IPアドレス> -p [ポート番号]
Sensu Serverの管理画面
Sensu Clientが追加されたことを確認するため、「http://<サーバのIPアドレス>:8080」にアクセスし、Sensuのダッシュボードに接続します。ダッシュボードの「Clients」をクリックすると、先ほど追加したDockerコンテナがいるのが分かります。

また、「http://<サーバのIPアドレス>:15672」にアクセスし、RabbitMQの管理画面に接続すると、接続数が1つ増えていることが分かります。

おわりに
ChefからDockerコンテナにSensu Clientをインストールすることができました。また、Sensuの特徴として、クライアント(監視対象)の自動登録がありますが、これらを確認することができました。
Sensuの監視の仕組みとして、Sensu Server側で監視の動作を定義して、Sensu Client側はsubscriptionsを使ってその監視定義の中から必要なものだけを選択する仕組みとなっているため、監視を共通化できれば監視設定を簡単にスケールさせることができそうです。