td-agent に fluent-plugin-mysql をインストールするための yum リポジトリを作る

td-agent に fluent-plugin-mysql を yum でインストールできるように、gem から rpm を作って yum リポジトリにしてみました。

- for CentOS 7.2.1511

## 手順

必要そうなパッケージをインストールします。

```sh
sudo yum -y install yum-utils createrepo rpm-build gcc make mysql-devel ruby rubygems ruby-devel
sudo gem install fpm
```

td-agent をインストールします。

```sh
curl -fsSL https://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh
```

td-agent の rpm をダウンロードします。


```sh
yumdownloader --enablerepo=treasuredata --destdir=td-agent/rpm td-agent
```

fpm コマンドを使って td-agent の rpm と同じディレクトリに gem から rpm を作ります。

```sh
cd td-agent/rpm

fpm -s gem -t rpm --gem-package-name-prefix=td-agent --gem-gem=td-agent-gem \
  --depends=td-agent mysql2

fpm -s gem -t rpm --gem-package-name-prefix=td-agent --gem-gem=td-agent-gem \
  --depends=td-agent mysql2-cs-bind

fpm -s gem -t rpm --gem-package-name-prefix=td-agent --gem-gem=td-agent-gem \
  --depends=td-agent --gem-disable-dependency=multi_json jsonpath

fpm -s gem -t rpm --gem-package-name-prefix=td-agent --gem-gem=td-agent-gem \
  --depends=td-agent --gem-disable-dependency=fluentd fluent-plugin-mysql
```

もとのディレクトリに戻って createrepo で yum リポジトリを作成します。

```sh
cd -
createrepo td-agent/
```

## インストールしてみる

↑で作成した yum リポジトリには td-agent も含んでいるので、既にインストールしているなら一旦削除します。

```sh
sudo yum erase td-agent
```

treasuredata のリポジトリも無効にしておきます。

```sh
sudo mv /etc/yum.repos.d/td.repo{,.bak}
```

ローカルのディレクトリを参照する yum リポジトリの設定ファイルを作ります。

```sh
sudo tee /etc/yum.repos.d/td-agent-local.repo <<EOS
[td-agent-local]
name = td-agent-local
baseurl = file://$PWD/td-agent
gpgcheck = 0
EOS
```

repolist でリポジトリが有効になっていることを確認します。

```sh
sudo yum repolist
```

yum で td-agent と fluent-plugin-mysql をインストールします。

```sh
sudo yum install td-agent td-agent-fluent-plugin-mysql
```

## 使ってみる

うまいことインストールされていることを確かめるために、試しに使ってみます。

MariaDB をインストールして適当なテーブルを作ります。

```sh
sudo yum install mariadb-server
sudo systemctl start mariadb.service
mysql test <<'EOS'
create table logs (
  id int not null primary key auto_increment,
  log_date datetime not null,
  message text not null
);
EOS
```

td-agent の設定ファイルを作って td-agent を開始します。

```sh
sudo tee /etc/td-agent/td-agent.conf <<'EOS'
<source>
  @type tail
  path /var/log/oreore.log
  pos_file /var/log/td-agent/oreore.log.pos
  format ltsv
  tag oreore.log
</source>
<match oreore.log>
  @type mysql_bulk
  host localhost
  database test
  username test
  column_names log_date,message
  key_names ${time},message
  table logs
  flush_interval 10s
</match>
EOS

sudo systemctl start td-agent.service
```

ログを書きます。

```sh
echo "message:ore"  | sudo tee -a /var/log/oreore.log
echo "message:are"  | sudo tee -a /var/log/oreore.log
echo "message:sore" | sudo tee -a /var/log/oreore.log
echo "message:dore" | sudo tee -a /var/log/oreore.log
echo "message:hore" | sudo tee -a /var/log/oreore.log
```

DB に書き込まれているか見てみます。

```sh
mysql test -e 'select * from logs'
```

次のように書き込まれていました。

```
+----+---------------------+---------+
| id | log_date            | message |
+----+---------------------+---------+
|  1 | 2016-10-04 13:33:32 | ore     |
|  2 | 2016-10-04 13:33:32 | are     |
|  3 | 2016-10-04 13:33:32 | sore    |
|  4 | 2016-10-04 13:33:32 | dore    |
|  5 | 2016-10-04 13:33:32 | hore    |
+----+---------------------+---------+
```

## fpm について

手順の途中で fpm で下記のように gem から rpm を作成していますが・・・

```
fpm -s gem -t rpm --gem-package-name-prefix=td-agent --gem-gem=td-agent-gem \
  --depends=td-agent mysql2

fpm -s gem -t rpm --gem-package-name-prefix=td-agent --gem-gem=td-agent-gem \
  --depends=td-agent mysql2-cs-bind

fpm -s gem -t rpm --gem-package-name-prefix=td-agent --gem-gem=td-agent-gem \
  --depends=td-agent --gem-disable-dependency=multi_json jsonpath

fpm -s gem -t rpm --gem-package-name-prefix=td-agent --gem-gem=td-agent-gem \
  --depends=td-agent --gem-disable-dependency=fluentd fluent-plugin-mysql
```

`-s gem -t rpm` は gem から rpm を作るという意味です。

`--gem-package-name-prefix=td-agent` は rpm の名前のプレフィックスを td-agent にするという意味です。例えば fluent-plugin-mysql という gem であれば td-agent-fluent-plugin-mysql という rpm になります。デフォルトは rubygems かなにかだったと思うんですけど、td-agent の embedd ではないシステムデフォルトの ruby と紛らわしそうなのでプレフィックを td-agent に変更しています。

`--gem-gem=td-agent-gem` は gem コマンドに td-agent-gem を使うという意味です。デフォルトだと gem なのででシステムにインストールされている gem が使われます。td-agent-gem が使われるように指定しています。

`--depends=td-agent` は rpm の依存関係に td-agent を追加します。

`--gem-disable-dependency=multi_json` と `--gem-disable-dependency=fluentd` は、gem の依存からこれらを省きます。gem の依存を元に rpm の依存が自動で追加されるため、これを指定しておかないと `td-agent-multi_json` とか `td-agent-fluentd` とかに依存するようになります。これらの gem は td-agent にバンドルされているので、td-agent を依存に追加しているならこれらの依存は不要です。

## さいごに

オフラインで fluent-plugin-mysql をインストールできるように rpm にしてみましたが、よく考えれば下記のように gem をダウンロードしておくだけでも良かったでした。

```sh
td-agent-gem fetch mysql2
td-agent-gem fetch mysql2-cs-bind
td-agent-gem fetch jsonpath
td-agent-gem fetch fluent-plugin-mysql
```

mysql2 が native extension なのでインストール時に gcc とかのビルド環境は必要ですが。