トップページに戻る

RedHat7 で td-agent 2.3.1 の全部入り rpm パッケージを作る

標準仕様だと ダウンロードしてもいいのですが 必要な td-agent を拡張する gem プラグインもインストールしたいのです。そこで github td-agent で提供されているソースから 必要な gem (td-agent のプラグイン)を全部入れた td-agent の rpm パッケージを作ってみます。

前提: ruby と omnibus バージョンを固定する

  • ScietntificLinux 7 で試しています。 CentOS7 または RedHat7 でもうまくいくはずです。

omnibus で、ruby と、td-agent をまるごとパッケージ化します。 yum で標準的に追加できる ruby とは別に、 /opt/td-agent 以下に td-agent だけで使用する ruby 環境が構築できます。

README.md にあるように ruby 2.1 以上ならいいみたいで、

We'll assume you have Ruby 2.1 and Bundler installed. First ensure all required gems are installed and ready to use:

しかしながら、 2.2.3 でもコンパイルできたときもあるけど、再現性がなかった。

td-agent の git log をみると 2016/6/6 の記述で、 ruby 2.1.10 で動作テストしたような記述があり、そのひとつあとの fluentd v0.12.26 に追従させたタグ 5a2235f34236c6f9186578b7fa3908640519afb5 でチェックアウトし、ruby 2.1.10 でパッケージを作ってみることにします。このタグは omnibus のバージョンが 5.4 に決め打ちされているのであとから再現できるのかなと思います(omnibus のバージョンもコロコロかわるので決め打ちされていないと、パッケージ作成が成功しない可能性が高い)。

いまのところ omnibus-software のバージョンが最新でも成功するが、バージョンアップされるとうまくいかない可能性もある、エラーがでる場合は、次のタグに固定するといい。

chef/omnibus-software dee0513e5234d5e42e9d0bdac90b1ba2d7876e7a

なお、ruby やら、 omunibus やら、omnibus-software の変更でよくでてくる現象は次の通りです。

 Could not find rake-10.1.0 


              [Builder: fluentd-ui] I | Build fluentd-ui: 95.0097s
The following shell command exited with status 1:

    $ BUNDLE_GEMFILE=Gemfile.production /opt/td-agent/embedded/bin/rake build

Output:

    (nothing)

Error:

    rake aborted!
/opt/td-agent/embedded/lib/ruby/gems/2.1.0/gems/bundler-1.10.6/lib/bundler/spec_set.rb:92:in `block in materialize': Could not find rake-10.1.0 in any of the sources (Bundler::GemNotFound)

パッケージ作成前の準備

古い td-agent を削除

td-agent を rpm パッケージでいれていたら削除してください。

  • omunibus では、 /opt 以下にインストールし、そのままパッケージ化します。パッケージを作るためにインストールするとき、仮に chroot する RPM_BUILD_ROOT なんて概念はないようです。

関連パッケージ

  1. epel レポジトリの設定 http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/7/x86_64/e/ あたりから epel-release-7-8.noarch.rpm をインストール(release-7-8 からバージョンが変わっているかもしれないので最新のものを)。
    $ sudo yum install http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/7/x86_64/e/epel-release-7-8.noarch.rpm
    
  2. 関連パッケージインストール
    $ sudo yum install gecode gecode-devel fakeroot
    $ sudo yum install -y openssl-devel readline-devel zlib-devel git
    $ sudo yum groupinstall 'Development tools'
    

rbenv のインストール

  • rbenv で ruby まわりはすべてホームディレクトリで完結させる 参考
  • yum で ruby パッケージを入れてしまってもいいがあとから rpm 管理外で omnibus を /usr/bin に入れられたりしてたちが悪い。
    • しかも使用する ruby のバージョン 2.1.10 は redhat7 の rpm と違う
  1. github より rbenv 環境をダウンロード
    $ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
    $ mkdir ~/.rbenv/plugins
    $ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
    
  2. ~/.bashrc に加える
    export PATH=$HOME/.rbenv/bin:$PATH
    eval "$(rbenv init -)"
    
  3. ~/.bashrc の反映
    $ source ~/.bashrc
    
  4. ruby 2.1.10 をコンパイルしておく
    $ rbenv install 2.1.10
    Downloading ruby-2.1.10.tar.bz2...
    -> https://cache.ruby-lang.org/pub/ruby/2.2/ruby-2.1.10.tar.bz2
    Installing ruby-2.1.10...
    Installed ruby-2.1.10 to /home/yamachan/.rbenv/versions/2.1.10
    

omnibus-td-agent ソースのダウンロード

  1. github より omnibus-td-agent をダウンロード
    $ git clone https://github.com/treasure-data/omnibus-td-agent.git
    $ cd omnibus-td-agent
    
  2. git log を参照し ruby v2.1.10 対応直後の fluentd v0.12.26 更新版を選ぶ
    [omnibus-td-agent]$ git checkout --force 5a2235f34236c6f9186578b7fa3908640519afb5
    
  3. omnibus-td-agent ディレクトリで使用する ruby のバージョンを 2.1.10 に固定
  4. bundler をインストール
    [omnibus-td-agent]$ rbenv local 2.1.10
    [omnibus-td-agent]$ ruby -v
    ruby 2.1.10p492 (2016-04-01 revision 54464) [x86_64-linux]
    [omnibus-td-agent]$ rbenv exec gem install bundler
    
  • 今回のチェックアウト fluentd v0.12.26 の omonibus は 5.4 で固定されている ため、このバージョンを選んだ
  • omnibus-software のバージョンは特定されていないが、もしうまくいかないのであれば次で固定する:
     chef/omnibus-software dee0513e5234d5e42e9d0bdac90b1ba2d7876e7a
    

まず README.md の通りに実行、動作確認

  • 最後に pkg 以下にパッケージができていることを確認
  • yamachan は自分の名前に置き換えてください
    $ sudo mkdir -p /opt/td-agent /var/cache/omnibus
    $ sudo chown yamachan:yamachan /opt/td-agent # 各ユーザー名で
    $ sudo chown yamachan:yamachan /var/cache/omnibus # 各ユーザー名で
    $ cd omnibus-td-agent
    [omnibus-td-agent]$ bundle install --binstubs
    [omnibus-td-agent]$ bin/gem_downloader core_gems.rb
    [omnibus-td-agent]$ bin/gem_downloader plugin_gems.rb
    [omnibus-td-agent]$ bin/gem_downloader ui_gems.rb
    [omnibus-td-agent]$ bin/omnibus build td-agent2
    略
                        [Packager::RPM] I | Creating .rpm file
                    [Project: td-agent] I | Building version manifest
                           [Compressor] I | No compressor defined for `rhel'.
                    [Project: td-agent] I | Building version manifest
    [omnibus-td-agent]$ ls -la pkg
    total 60488
    drwxrwxr-x  2 yamachan yamachan      124 Aug  7 18:36 .
    drwxrwxr-x 16 yamachan yamachan     4096 Aug  8 10:48 ..
    -rw-rw-r--  1 yamachan yamachan 61910902 Aug  8 10:45 td-agent-2.3.1-0.el7.x86_64.rpm
    -rw-rw-r--  1 yamachan yamachan    13686 Aug  8 10:45 td-agent-2.3.1-0.el7.x86_64.rpm.metadata.json
    -rw-rw-r--  1 yamachan yamachan     6906 Aug  8 10:45 version-manifest.json
    

ruby-2_1_3-no-mkmf.patch がないと言われたとき

  • yamachan は自分の名前に置き換えてください

現象:

[omnibus-td-agent]$ bin/omnibus build td-agent2
                              [CLI] I | Using config from 'omnibus.rb'
Attempting to apply the patch `ruby-2_1_3-no-mkmf.patch', but it was not found at any of the
following locations:

    /home/yamachan/.rbenv/versions/2.1.10/lib/ruby/gems/2.1.0/bundler/gems/omnibus-software-46b5677a209d/config/patches/ruby/ruby-2_1_3-no-mkmf.patch

  1. google で探す、例: https://github.com/habitat-sh/core-plans/blob/master/ruby/patches/ruby-2_1_3-no-mkmf.patch
  2. ダウンロード、指摘されている場所に置く
    [omnibus-td-agent]$ wget https://raw.githubusercontent.com/habitat-sh/core-plans/master/ruby/patches/ruby-2_1_3-no-mkmf.patch
    [omnibus-td-agent]$ mv ruby-2_1_3-no-mkmf.patch /home/yamachan/.rbenv/versions/2.1.10/lib/ruby/gems/2.1.0/bundler/gems/omnibus-software-46b5677a209d/config/patches/ruby/
    

git の設定がされていないと怒られる

  • git の設定がされていないと怒られるときは指摘通りに
  • 自分の名前とメールアドレスに置き換えてください
    [omnibus-td-agent]$ git config --global user.email "yamachan@piwikjapan.org"
    [omnibus-td-agent]$ git config --global user.name "YAMAMOTO Takashi"
    

途中恐らく zlib-1.2.8.tar.gz をダウンロードできなくてとまるのでその対処

現象:

                 [NetFetcher: zlib] I | Downloading from `http://iweb.dl.sourceforge.net/project/libpng/zlib/1.2.8/zlib-1.2.8.tar.gz'
略
                 [NetFetcher: zlib] I | Retrying failed download due to 404 Not Found (5 retries left)...
                 [NetFetcher: zlib] I | Retrying failed download due to 404 Not Found (4 retries left)...                                                                                                                                                                                      0% (0 KB/sec)
                 [NetFetcher: zlib] I | Retrying failed download due to 404 Not Found (3 retries left)...                                                                                                                                                                                      0% (0 KB/sec)
略
                 [NetFetcher: zlib] I | Retrying failed download due to 404 Not Found (2 retries left)...
略
                 [NetFetcher: zlib] I | Retrying failed download due to 404 Not Found (1 retries left)...
                 [NetFetcher: zlib] E | Download failed - OpenURI::HTTPError!                                                                                                                                                                                                                  0% (0 KB/sec)
/home/yamachan/.rbenv/versions/2.1.10/lib/ruby/2.1.0/open-uri.rb:353:in `open_http': 404 Not Found (OpenURI::HTTPError)

  1. zlib-1.2.8 はダウンロードされていることにする
    [omnibus-td-agent]$ wget http://zlib.net/zlib-1.2.8.tar.gz 
    [omnibus-td-agent]$ mv zlib-1.2.8.tar.gz /var/cache/omnibus/cache/
    

全部入りパッケージを作成します

elasticsearch, geoip 他便利 gem を追加します、これらはパッケージに入る

  1. gioip のインストール
    $ sudo yum install GeoIP-devel GeoIP GeoIP-update
    
  2. mariadb も
    $ sudo yum install mariadb-server mariadb-devel
    
  3. plugin_gems.rb に追加
    download "fluent-plugin-norikra", "0.4.2"
    download "fluent-plugin-elasticsearch", "1.5.0"
    download "fluent-plugin-record-reformer", "0.8.1"
    download "fluent-plugin-uri_decoder", "0.2.0"
    download "fluent-plugin-geoip", "0.6.1"
    download "fluent-plugin-mail", "0.2.4"
    download "fluent-plugin-mysql-replicator", "0.5.2"
    
  4. もう一度作り直す
    [omnibus-td-agent]$ bin/gem_downloader plugin_gems.rb
    [omnibus-td-agent]$ bin/omnibus build td-agent2
    
  5. できあがったパッケージは、 plugin_gems.rb で追加した gem が含まれています。

gioip のライブラリが拒絶される

現象:

[omnibus-td-agent]$ bin/omnibus build td-agent2
略
                      [HealthCheck] I | Running health on td-agent
                      [HealthCheck] E | Failed!
                      [HealthCheck] E | The following libraries have unsafe or unmet dependencies:
    --> /opt/td-agent/embedded/lib/ruby/gems/2.1.0/gems/geoip-c-0.9.1/ext/geoip/geoip.so
    --> /opt/td-agent/embedded/lib/ruby/gems/2.1.0/gems/geoip-c-0.9.1/lib/geoip.so
    --> /opt/td-agent/embedded/lib/ruby/gems/2.1.0/extensions/x86_64-linux/2.1.0/geoip-c-0.9.1/geoip.so

                      [HealthCheck] E | The following binaries have unsafe or unmet dependencies:

                      [HealthCheck] E | The following libraries cannot be guaranteed to be on target systems:
    --> /lib64/libGeoIP.so.1 (0x00007fdbf1c54000)
    --> /lib64/libGeoIP.so.1 (0x00007f15825b5000)
    --> /lib64/libGeoIP.so.1 (0x00007fed88568000)

  1. health_check.rb ってどこにあるのよ
    • yamachan は自分のディレクトリになります。
      $ sudo updatedb
      $ locate health_check.rb
      /home/yamachan/.rbenv/versions/2.1.10/lib/ruby/gems/2.1.0/gems/omnibus-5.4.0/lib/omnibus/health_check.rb
      
  2. health_check.rb を修正
    • yamachan は自分のディレクトリになります。
    • health_check.rb に + がついている行を追加します(+ 自身は削ります)。
    • /libGeoIP\.so/ 以下は fluent-plugin-mysql-replicator のための設定です。fluent-plugin-mysql-replicator をインストールしなければ不要。
      [omnibus]$ diff -u health_check.rb.orig health_check.rb
      --- health_check.rb.orig        2016-08-07 21:06:39.611277359 +0900
      +++ health_check.rb     2016-08-07 21:21:58.474090296 +0900
      @@ -43,6 +43,18 @@
             /libutil\.so/,
             /linux-vdso.+/,
             /linux-gate\.so/,
      +      /libGeoIP\.so/,
      +      /libmysqlclient\.so/,
      +      /libcom_err\.so/,
      +      /libcrypto\.so/,
      +      /libgssapi_krb5\.so/,
      +      /libk5crypto\.so/,
      +      /libkeyutils\.so/,
      +      /libkrb5\.so/,
      +      /libkrb5support\.so/,
      +      /libpcre\.so/,
      +      /libselinux\.so/,
      +      /libssl\.so/,
           ].freeze
      
           ARCH_WHITELIST_LIBS = [
      

インストール

パッケージを作ったサーバーにインストール

$ sudo yum install GeoIP-update
$ sudo geoipupdate
$ sudo rm -rf /opt/td-agent
$ sudo yum install redhat-lsb-core
$ cd omnibus-td-agent
[omnibus-td-agent]$ sudo yum install pkg/td-agent-2.3.1-0.el7.x86_64.rpm
  • geoipupdate 実行により、 /usr/share/GeoIP/GeoLiteCity.dat が作成されます。

新規インストール

$ sudo yum install GeoIP GeoIP-update
$ sudo geoipupdate
$ sudo yum install redhat-lsb-core
$ sudo yum install td-agent-2.3.1-0.el7.x86_64.rpm
  • td-agent-2.3.1-0.el7.x86_64.rpm は、パッケージを作ったサーバーから転送しください。
  • geoipupdate 実行により、 /usr/share/GeoIP/GeoLiteCity.dat が作成されます。