たごもりすメモ

コードとかその他の話とか。

自家製 td-agent のrpmをつくる

自社サービスの運営のために fluentd を使っているとrpmでインストールできる td-agent が大変便利だ。

便利だが、自社内で使うんだから、もう最初から自社用の設定とかその設定に必要なプラグインとか入っててほしい。そんで yum install td-agent をサーバ上で実行したら設定とかいじらないでいいようにしたい。みんなラクをしたいでしょ!?

もちろん td-agent のリポジトリをforkしてあれこれ手を入れればできるが、そうするとその後のメンテナンスが面倒だ。リポジトリ自体のアップデートはTreasure Dataの人に頑張っていただいて、我々は spec をいじる程度に収めておきたい。みんなラクをしたいよねー。

した

いろいろと td-agent のビルドスクリプトに手を入れる必要はあったが、もうその修正は当たっているのでみなさんは以下の手順を実行するだけでよろしい。

td-agent gitリポジトリのclone

まずビルドに必要なものがあれこれあるので、td-agent のリポジトリをcloneしてきてそこで作業する。tarballだけではいろいろあってビルドできない。めんどくさい。

$ git clone https://github.com/treasure-data/td-agent.git
$ cd td-agent
自社向け td-agent.conf の準備

cloneしたリポジトリredhat/td-agent.conf.custom というパスで自社内用の設定を書く。これを置いておくと rpm パッケージ内で /etc/td-agent/td-agent.conf になる。*1

内容は普通に fluentd の設定を書くだけ。イチから書いてもいいし、redhat/td-agent.conf からコピペして変更してもいい。

specの変更

redhat/td-agent.spec を変更する。キモは以下のとおり。

  • "Release" に自社向けリリースリビジョンを入れる
    • ex: 0.tagomoris
    • 設定ファイルの変更なんかがあったときに上げるのに使う
  • '%configure' セクションでプラグインを追加
    • 自社向けパッケージに必要なプラグインの追加をここに1プラグインずつ書く
    • ex: make extplugin EXTGEM=fluent-plugin-ping-message-0.1.0.gem
    • ex: make extplugin EXTGEM=fluent-plugin-file-alternative-0.1.4.gem
    • たとえば自社内gitリポジトリにある gem であってもここに書いてしまえる
    • ex: make extplugin EXTGEM=fluent-plugin-fantastic-incredible-dreemy-something-0.9.9.gem

これ以外には基本的にいじらなくてよいはず。

pluginのダウンロード

td-agentパッケージビルド前に、同梱するプラグインのgemをあらかじめダウンロードして plugin_gems ディレクトリに配置しておこう。ビルド時のダウンロードにまかせてもいいが、数が多くなると rubygems.org が503を返して拒否ることがあってやっかいだからだ。

また自社内リポジトリで管理しているgemもこのときいっしょにダウンロードしてディレクトリに入れておく。rubygems.orgに無いプラグインはそうしておかないとビルドに失敗する。

なお td-agent が必要とするプラグインMakefile.am の先頭のほうに PLUGINS として書いてあるので、そいつを対象に適当に wget でもなんでも回そう。

mkdir plugin_gems
cd plugin_gems

PLUGINS="td-client-0.8.56.gem td-0.10.96.gem fluent-plugin-td-0.10.17.gem \
  thrift-0.8.0.gem fluent-plugin-scribe-0.10.10.gem \
  fluent-plugin-flume-0.1.1.gem \
  bson-1.8.6.gem bson_ext-1.8.6.gem mongo-1.8.6.gem fluent-plugin-mongo-0.7.1.gem \
  nokogiri-1.5.10.gem aws-sdk-1.8.3.1.gem fluent-plugin-s3-0.3.5.gem \
  webhdfs-0.5.3.gem fluent-plugin-webhdfs-0.2.1.gem \
  fluent-plugin-rewrite-tag-filter-1.3.1.gem \
  fluent-plugin-td-monitoring-0.1.0.gem \
  fluent-plugin-ping-message-0.1.0.gem fluent-plugin-file-alternative-0.1.4.gem \
  fluent-mixin-plaintextformatter-0.2.5.gem"

for p in $PLUGINS ; do
  wget http://rubygems.org/downloads/$p -O $p || break
done

cd ..
ビルド

ビルドは基本的に make-rpm.sh を実行するだけ。revisionも指定できるけど、まあいらないでしょ。

./make-rpm.sh

しばらく待っているとrpmができる。おしまい。あとは適当にyumサーバに放り込むだけ! やった!

rpathまわり

RPATHが云々言われてビルドが通らないことがある。RHEL6/CentOS6以降とかですね。ビルド済みモジュールをrubyごと入れたりするのでしょうがない感が高い、ので、無視するようにしてしまおう。

export QA_RPATHS=$[ 0x0001|0x0002|0x0004|0x0010 ]
./make-rpm.sh

解決!

.debは?

知らん! 誰かがんばって! 共通部分はどうにかなるように直したはずなので! 仕事で使わないとモチベーションが維持できないくらいつらい作業なの!

おしまい

このエントリは Fluentd Advent Calendar 2014 の24日目でした!
Fluentd Advent Calendar 2013 - Qiita

*1:なぜとか言わないでくれ、深遠な理由によりそのようにせざるをえなかった。俺がいちばんつらい。