hidemium's blog

日々学んだことをアウトプットする。

ChefからDockerコンテナにSensu Clientをインストールする

前回、ChefからDockerコンテナにSensu Serverをインストールすることができました。そこで、今回はChefからDockerコンテナにSensu Clientをインストールして、Dockerコンテナが自動的に監視対象として追加されるか試してみました。
また、Clientの監視定義として、CPU使用率監視、メモリ使用率監視、ログ監視が設定されるようにしてみました。

構成

Ubuntu 12.04: サーバ構築対象
Ubuntu 12.04はDocker 1.0.0上で動作しています。

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
  • Sensu Clientをインストールするために、Sensuのリポジトリを指定しています。
  • GitHubからSensuのCommunity Pluginを取得しています。
  • Sensu Clientを起動するため、supervisorの定義ファイルであるsensu-client.confを配置しています。

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コンテナがいるのが分かります。

f:id:hidemium:20140708031053p:plain

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

f:id:hidemium:20140708031106p:plain

おわりに

ChefからDockerコンテナにSensu Clientをインストールすることができました。また、Sensuの特徴として、クライアント(監視対象)の自動登録がありますが、これらを確認することができました。

Sensuの監視の仕組みとして、Sensu Server側で監視の動作を定義して、Sensu Client側はsubscriptionsを使ってその監視定義の中から必要なものだけを選択する仕組みとなっているため、監視を共通化できれば監視設定を簡単にスケールさせることができそうです。