へろへろもへじ

(ブログタイトル募集中)

Fluentdのインストール〜設定をChefのクックブック化してみた

先日、「入門Chef Solo」*1を読了しまして、勉強がてらに以前構築したFluentdの環境*2をクックブック化してみました。もっとスマートな書き方があるかと思いますが、要件は満たせたので備忘録として残しておきます。

クックブックを作る前の前準備

1.knifeをインストールする

$ gem install knife-solo

2.レポジトリを作る

$ knife solo init chef-repo

3.Berkshelfをインストールする *3

$ cd chef-repo
$ vi GemFile
—
source :rubygems
gem 'berkshelf'

$ bundle --path vendor/bundle

4.Berksfileというファイルを作り、中に利用したいクックブック一覧(今回はtd-agent)をリストアップする

$ vi Berksfile
—
site :opscode
cookbook 'td-agent', git: 'https://github.com/treasure-data/chef-td-agent.git'

5.Berkshelfを実行しtd-agentのインストールに必要なパッケージをごっそりダウンロードする

$ bundle exec berks --path=cookbooks

クックブックを作る

1.まずはクックブックのテンプレートを作る

$ knife cookbook create td-agent-custom -o site-cookbooks

2.filesディレクトリに以前作ったコンフィグファイルをコピーする

3.recipesディレクトリにレシピを作る

送信側のレシピ
include_recipe "td-agent"

cookbook_file "/etc/td-agent/td-agent.conf" do
  source "/sender/td-agent.conf"
  owner "root"
  group "root"
  mode "0644"
end
受信側のレシピ
include_recipe "td-agent"

directory "/etc/td-agent/conf.d" do
  owner "root"
  group "root"
  mode "0755"
  action :create
end

%w{
  json_nest2flat.conf
  jsonbucket.conf
  parser.conf
  redshift.conf
}.each do | file_name |
  cookbook_file "/etc/td-agent/conf.d/#{file_name}" do
    source "/reciver/conf.d/#{file_name}"
    owner "root"
    group "root"
    mode "0644"
  end
end

cookbook_file "/etc/td-agent/td-agent.conf" do
  source "/reciver/td-agent.conf"
  owner "root"
  group "root"
  mode "0644"
end

4.attributesディレクトリに変数を定義したファイルを用意する

if "#{node[:roles]}" == 'td-agent-custom-reciver'
  # 受信側
  override[:td_agent][:api_key] = "reciver"
  override[:td_agent][:plugins] = ["parser","forest", "jsonbucket", "redshift", "json-nest2flat", "order"]
else
  # 送信側
  override[:td_agent][:api_key] = "sender"
  override[:td_agent][:plugins] = ["tail-ex"]
end

5.metadata.rbに依存関係のあるクックブックを追記する

depends "yum"
depends "apt"
depends "td-agent"

これでクックブックが完成しました。ディレクトリ構成は以下の通り。

$ tree td-agent-custom/
td-agent-custom/
├── CHANGELOG.md
├── README.md
├── attributes
│   └── override.rb
├── definitions
├── files
│   └── default
│       ├── reciver
│       │   ├── conf.d
│       │   │   ├── json_nest2flat.conf
│       │   │   ├── jsonbucket.conf
│       │   │   ├── parser.conf
│       │   │   └── redshift.conf
│       │   └── td-agent.conf
│       └── sender
│           └── td-agent.conf
├── libraries
├── metadata.rb
├── providers
├── recipes
│   ├── default.rb
│   ├── reciver.rb
│   └── sender.rb
├── resources
└── templates
    └── default

13 directories, 13 files

実行してみる

送信側と受信側にロールを分けて作る

送信側
{
 "name" : "td-agent-custom-sender",
 "default_attributes" : {},
 "override_attributes": {},
 "json_class" : "Chef::Role",
 "description" : "",
 "chef_type" : "role",
 "run_list": [
    "recipe[td-agent-custom::sender]"
  ]
}
受信側
{
 "name" : "td-agent-custom-reciver",
 "default_attributes" : {},
 "override_attributes": {},
 "json_class" : "Chef::Role",
 "description" : "",
 "chef_type" : "role",
 "run_list": [
    "recipe[td-agent-custom::reciver]"
  ]
}
ディレクトリ階層は以下の通り。
tree chef-repo/roles/
roles/
├── td-agent-custom-reciver.json
└── td-agent-custom-sender.json

0 directories, 2 files
nodes配下の対象ホストのjsonに、上記実行したいロールを設定する。
{
  "run_list": [
    "role[td-agent-custom-sender]"
  ]
}
chef-solo実行
$ knife solo cook <host>

これでFluentdのインストール〜設定が、対象ホストにされました。
今回のクックブックはこちらです → fukuiretu/chef-td-agent-custom · GitHub

*1:Chef初心者の必読書

入門Chef Solo - Infrastructure as Code

入門Chef Solo - Infrastructure as Code

*2:構築した時の記事はこちら→Fluentdを使ってアプリ側で吐いたログをAmazonRedshift上のテーブルに登録する - へろへろもへじ

*3:bundlerがインストールされていない場合、gem install bundlerする