Chef で kibana + elasticsearch + fluentd デプロイしてみた

こんにちは。@jedipunkz です。

前回 kibana + elasticsearch + fluentd を構築する方法を載せたのだけど手動で構築 したので格好悪いなぁと思っていました。いうことで! Chef でデプロイする方法を調 べてみました。

意外と簡単に出来たし、スッキリした形でデプロイ出来たのでオススメです。

前提の環境は…

  • Ubuntu 12.04 LTS precise
  • Chef サーバ構成
  • 入力するログは nginx (例)
  • オールインワン構成

Cookbook が他の OS に対応しているか確認していないので Ubuntu を前提にしていま す。Chef サーバのデプロイや knife の設定は済んでいるものとして説明していきます。 例で nginx のログを入力します。なので nginx も Chef でデプロイします。ここは他 のものに置き換えてもらっても大丈夫です。手順を省略化するためオールインワン構成 で説明します。nginx, fluentd は複数のノードに配置することも手順を読み替えれば もちろん可能です。

Cookbook の準備

お決まり。Cookbooks の取得に Berkshelf を用いる。

% cd chef-repo
% gem install berkshelf
% ${EDITOR} Berksfile
cookbook 'elasticsearch', git: 'https://github.com/elasticsearch/cookbook-elasticsearch.git'
cookbook 'td-agent', git: 'https://github.com/treasure-data/chef-td-agent.git'
cookbook 'kibana', git: 'https://github.com/realityforge/chef-kibana.git'
cookbook 'nginx', git: 'https://github.com/opscode-cookbooks/nginx.git'

Cookbooks を取得します。

% berks install --path=./cookbooks

elasticsearch デプロイ準備

elasticsearch の Role を作成する。java, elasticsearch レシピを指定。また Java に openjdk7 を override_attributes にて指定する。openjdk6 だと elasticsearch が起動し なかった。尚、デフォルトは 6 です。Environment で override_attributes を指定し てもらっても構わないです。

% ${EDITOR} roles/elasticsearch.rb
name "elasticsearch"
description "Base role applied to elasticsearch nodes."
run_list(
  "recipe[java]",
  "recipe[elasticsearch]"
)
override_attributes "java" => { "install_flavor" => "openjdk", "jdk_version" => "7" }

fluentd デプロイの準備

td-agent (fluentd) の Role を作成する。override_attributes にて td-agent のプ ラグインを指定。配列で複数指定可能。こちらも同じく Role で override_attributes を指定したが Environments で指定しても構わないです。あと公式の README には attributes に直接 plugins を指定するよう書いてありましたが、構成毎に plugins は変えたいと思うので、この様に Roles, Environments で指定するのが良いと思います。

% ${EDITOR}  roles/td-agent.rb
name "td-agent"
description "Base role applied to td-agent nodes."
run_list(
  "recipe[td-agent]"
)
override_attributes "td_agent" => {
                      "plugins" => [ "elasticsearch" ]
                    }

td-agent.conf の template を作成。今回は nginx の /var/log/nginx/localhost.access.log を入力する。これは例なので好きなログを指定 可能。

% ${EDITOR}  cookbooks/td-agent/templates/default/td-agent.conf.erb
<source>
  type tail
  format nginx
  path /var/log/nginx/localhost.access.log
  tag foo01.nginx.access
</source>

<match *.nginx.*>
  index_name adminpack
  type_name nginx
  type elasticsearch
  include_tag_key true
  tag_key @log_name
  host localhost
  port 9200
  logstash_format true
  flush_interval 10s
</match>    

デプロイ

Cookbooks, Roles を Chef サーバにアップロード。

% knife cookbook upload -o cookbooks -a
% knife role from file roles/*.rb

knife bootstrap しデプロイ!

% knife bootstrap <ip_addr> -N <hostname> -r \
  'role[td-agent]','role[elasticsearch]','recipe[kibana]','recipe[nginx]' \
  --sudo -x <username>

下記の URL にブラウザでアクセスし nginx のログを生成。

http://<ip_addr>/

下記の URL にて Kibana の UI 越しにログ解析結果を確認出来る。

http://<ip_addr>:5601

まとめ

fluentd plugins は複数指定可能。環境毎に td-agent.conf を変更したいという要望 があると思うけど fluentd の Recipe を修正する必要がありそう。それとも td-agent.conf 自体でうまくさばけるのかな?調べてない。オールインワン構成で説明 しましたが、elasticsearch + kibana のノードに対して、複数の nginx(なんでも良い) + td-agent ノードの構成が一般的だと思います。手順を読み替えてやってみてくださ い。その場合 kibana の Cookbook の attributes 中に elasticsearch の IP アドレ ス・ポートを記す箇所があるので Role, Environments で上書きしてあげてください。

default['kibana']['elasticsearch']['hosts'] = ['127.0.0.1']
default['kibana']['elasticsearch']['port'] = 9200
````

あと td-agent/templates/default/td-agent.conf.erb の中に記した host, port の指
定も elasticsearch のホスト情報に書き換えてあげてください。

host localhost port 9200 ```

以上です。意外と簡単に出来ました。スッキリ。