ja ja ja ja ja ja ja ja ja en ja ja ja ja ja ja ja ja ja ja ja de ja ja ja fr fr ja ja ja en ja ja ja ja en en en ja en ja ja ja ja ja zh ja fr ja ja ja en ja ja en ja en ja ja fr ja ja fr ja en ja ja ja en ja ja ja ja ja ja ja vi ja ja ja ja ja ja ja ja ja en ja ja en ja ja vi ja sv eu ja en en hu ja ja en en pl ja ja jbo hbs_lat en ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja
今の場合、td-agentをインストールした後、すぐにGemfileを置いてtd-agentを再起動したとすると以下のファイルやディレクトリのパーミションをチェックします。
/etc/td-agent
/etc/td-agent/td-agent.conf
/etc/td-agent/plugin
そのパーミッションは以下の通りで、pluginディレクトリとtd-agent.confはtd-agentユーザーから書き込みできません。
$ ls -laR /etc/td-agent/ /etc/td-agent/: total 16 drwxr-xr-x 3 td-agent td-agent 4096 Mar 1 08:44 . drwxr-xr-x 57 root root 4096 Mar 5 06:14 .. drwxr-xr-x 2 root root 4096 Mar 1 08:43 plugin -rw-r--r-- 1 root root 2381 Mar 1 08:44 td-agent.conf
よって、bundlerはsudoが必要だと判定してしまいます。
どのようにすればよいかは後述します。
td-agentユーザーのホームディレクトリが存在しない
これはdebパッケージ限定の問題ですが、masterでは修正済みです。 ホームディレクトリが存在しない場合、/tmp/bundler/home/vagrantのようなディレクトリをかわりに使用するため、マシンを再起動するとbundlerのキャッシュが消えます。 また、起動するたびにログにメッセージが残るのも本来着目すべきログを見つけづらくなります。
td-agent 3.1.1のメンテナスクリプトでは、以下のようにホームディレクトリ(/home/td-agent)を作成していませんでした。
adduser --group --system --no-create-home td-agent
ホームディレクトリを /var/lib/td-agent に変更して作成します。 /var/lib/td-agentにしたのはRPMに合わせるためです。また、システムユーザーは/var/lib以下にホームディレクトリを持つことが多いためです。
$ sudo usermod -d /var/lib/td-agent td-agent $ sudo mkdir -p /var/lib/td-agent $ sudo chown -R td-agent:td-agent /var/lib/td-agent
systemdのドロップインファイルについて
td-agentはsystemdに対応しているので、systemdの場合はtd-agentのオプションをカスタマイズするのに/etc/default/td-agent1や/etc/sysconfig/td-agent2は使いません。
ドロップインファイルというものを使用します。
$ sudo systemctl edit td-agent.service
を実行するとエディターが起動するので、内容を書いて保存すると/etc/systemd/system/td-agent.service.d/override.confというファイルを作成することができます。
td-agent 3.1.1 の場合は以下のようにすると、td-agentのオプションを変更することができます。
[Service] Environment='TD_AGENT_OPTIONS=--gemfile=/etc/td-agent/Gemfile' ExecStart= ExecStart=/opt/td-agent/embedded/bin/fluentd --log /var/log/td-agent/td-agent.log --daemon /var/run/td-agent/td-agent.pid $TD_AGENT_OPTIONS
masterではExecStartに$TD_AGENT_OPTIONSが追加されているので以下のようにEnvironmentだけ指定すれば十分です。
[Service] Environment='TD_AGENT_OPTIONS=--gemfile=/etc/td-agent/Gemfile'
参考: systemd - ArchWiki
td-agent 3.1.1
td-agent 3.1.1では次のようにします。
debの場合、td-agentユーザーのホームディレクトリを作成してください。
$ sudo usermod -d /var/lib/td-agent td-agent $ sudo mkdir -p /var/lib/td-agent $ sudo chown -R td-agent:td-agent /var/lib/td-agent
bundlerがsudoを必要としないドロップインファイルは以下の通りです。--gem-fileオプションでGemfileを指定し、--gempathオプションでtd-agentユーザーが書き込むことができるパスを指定します。
[Service] Environment='TD_AGENT_OPTIONS=--gemfile=/etc/td-agent/Gemfile --gempath=/var/lib/td-agent/vendor/bundle' ExecStart= ExecStart=/opt/td-agent/embedded/bin/fluentd --log /var/log/td-agent/td-agent.log --daemon /var/run/td-agent/td-agent.pid $TD_AGENT_OPTIONS
td-agent の次のリリースでは
bundlerがsudoを必要としないドロップインファイルは以下の通りです。
td-agentユーザーのホームディレクトリはパッケージによって作成済みなので、ドロップインファイルで環境変数を指定すればよいだけです。 環境変数の内容はtd-agent 3.1.1と同じです。
[Service] Environment='TD_AGENT_OPTIONS=--gemfile=/etc/td-agent/Gemfile --gempath=/var/lib/td-agent/vendor/bundle'
Gemfileでプラグインを管理する場合、td-agent起動時にbundle installを実行するため、td-agentにバンドルされているgemであってもgemパッケージをダウンロードします。 Gemfileでプラグインのバージョンを固定できるというメリットとのトレードオフです。
td-agent3でGemfileを使ってFluentdのプラグインを管理する方法を紹介しました。 きちんと設定すればtd-agentユーザーにsudoできる権限を与えずにGemfileを使ってFluentdのプラグインを管理することができます。
現在クリアコードではソフトウェア開発者を募集しています! フリーソフトウェア開発での開発の仕方をベースに、成果や知識を公開し共有しながら業務に携われます。
Fluentdに関してトラブルシューティングガイドを公開しています。 問題点の確認の仕方や、これまでFluentd開発にかかわる間にあった事例などを紹介しています。
Python/CFFIを利用してC拡張を作成する (2/2)
fluent-plugin-elasticsearch v2.8.6/v1.13.4からのX-Pack向けの認証情報の設定方法の注意点
Apache Arrow
milter manager
ククログの記事はCC BY-SA 4.0とGFDLのデュアルライセンスで自由に利用できます。
クリアコードはプログラミングが楽しいソフトウェア開発者を1名募集しています。
クリアコードは「クリアコードをいい感じにする人」を1名募集しています。
クリアコードはフリーソフトウェア開発で培った技術力を提供しています。特にMozilla製品(Mozilla FirefoxとMozilla Thunderbird)とRubyとGroonga(全文検索)に関連した開発を得意としています。