Raspbianにsensu-clientを導入する

# はじめに

[前回作ったQEMU環境](http://qiita.com/metalels/items/695fc9635b5ce4a452fc)を使い、Raspbianにsensu-clientを導入してみました。

# 環境

```shell-session:bash
pi@raspberrypi:~$ cat /etc/os-release
PRETTY_NAME="Raspbian GNU/Linux 8 (jessie)"
NAME="Raspbian GNU/Linux"
VERSION_ID="8"
VERSION="8 (jessie)"
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"
pi@raspberrypi:~$ uname -a
Linux raspberrypi 4.4.34+ #3 Thu Dec 1 14:44:23 IST 2016 armv6l GNU/Linux
pi@raspberrypi:~$ ruby -v
ruby 2.1.5p273 (2014-11-13) [arm-linux-gnueabihf]
pi@raspberrypi:~$ gem -v
1.8.24
pi@raspberrypi:~$ gem list

*** LOCAL GEMS ***

bundler (1.14.6)
```

## rubygems インストール
rubygemsが入ってない人はインストールしましょう。

```bash
sudo apt install rubygems
sudo echo "install: --no-document" >> /root/.gemrc
sudo echo "update: --no-document" >> /root/.gemrc
sudo gem install bundler
```

## コンパイル用ライブラリのインストール

```bash
sudo apt-get install git ruby-dev gcc make m4
```

# sensu のインストール

## sensu-build の取得

```shell-session:リポジトリのクローン
pi@raspberrypi:~$ sudo su -
root@raspberrypi:~# cd /usr/local/src
root@raspberrypi:~# git clone https://github.com/sensu/sensu-build.git
Cloning into 'sensu-build'...
remote: Counting objects: 1752, done.
remote: Total 1752 (delta 0), reused 0 (delta 0), pack-reused 1752
Receiving objects: 100% (1752/1752), 648.26 KiB | 861.00 KiB/s, done.
Resolving deltas: 100% (983/983), done.
Checking connectivity... done.
```

## zlib バージョンの確認

zlibは頻繁にバージョンアップされており、sensu-buildで指定されているzlibのバージョンが古い場合、リンク切れを起こすことがあります。
そのため、リンク切れしていないかをまず確認します。
[zlibのサイト](http://zlib.net/)で_Current release:_のバージョンを確認します。(私の場合は1.2.11でした)

次に sensu-build 内の recipes/zlib.rake を開き、t.version が上記のzlibバージョンと合っているかを確認します。
違う場合は変更しましょう。

```diff:zlibバージョンの変更
-   t.version = '1.2.8'
+   t.version = '1.2.11'
```

## コンパイルオプションの確認

rasberry pi の種類によって搭載されているCPUが異なるため、コンパイルオプションを変更しましょう。

sensu-build 内の recipes/ruby.rake を開き、t.version が上記のzlibバージョンと合っているかを確認します。

```diff:RasberryPi1の場合
-   if arch == "armv6l" || arch == "armv7l"
-     t.build_environment['CFLAGS'] = "-march=armv6 -mfloat-abi=hard -mfpu=vfp #{t.build_environment['CFLAGS']}"
-   end
+   t.build_environment['CFLAGS'] = "-mcpu=arm1176jzf-s -mfpu=vfp -mfloat-abi=hard -mlittle-endian -munaligned-access #{t.build_environment['CFLAGS']}"
```

```diff:RasberryPi2/3の場合
-   if arch == "armv6l" || arch == "armv7l"
-     t.build_environment['CFLAGS'] = "-march=armv6 -mfloat-abi=hard -mfpu=vfp #{t.build_environment['CFLAGS']}"
-   end
+   t.build_environment['CFLAGS'] = "-mcpu=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=hard -mlittle-endian -munaligned-access #{t.build_environment['CFLAGS']}"
```

## sensu-build のビルド

```bash:Sensuバージョンの指定
export SENSU_VERSION=0.26.5
```

```bash:ビルドバージョンの指定
export BUILD_NUMBER=2
```

```shell-session:依存ライブラリのインストール
pi@raspberrypi:~$ sudo su -
root@raspberrypi:~# ruby-dev gcc make libc-dev m4
#### 省略 ####
root@raspberrypi:~# cd /usr/local/src/sensu-build
root@raspberrypi:/usr/local/src/sensu-build# bundle install
Don't run Bundler as root. Bundler can ask for sudo if it is needed, and installing your bundle as root
will break this application for all non-root users on this machine.
Fetching gem metadata from https://rubygems.org/............
Fetching version metadata from https://rubygems.org/..
Fetching dependency metadata from https://rubygems.org/.
~~~~~~~ 省略 ~~~~~~~
Installing bunchr 0.1.6
Bundle complete! 4 Gemfile dependencies, 17 gems now installed.
Use `bundle show [gemname]` to see where a bundled gem is installed.
```

```shell-session:ビルド実行
root@raspberrypi:/usr/local/src/sensu-build# rake clean
root@raspberrypi:/usr/local/src/sensu-build# time rake
mkdir -p /tmp/build/autoconf
I, [2017-03-19T12:50:37.571622 #10857]  INFO -- : Downloading autoconf 2.63
I, [2017-03-19T12:50:37.582153 #10857]  INFO -- : Executing: [curl -O http://ftp.gnu.org/gnu/autoconf/autoconf-2.63.tar.gz]
I, [2017-03-19T12:50:44.045611 #10857]  INFO -- : Executing: [tar xfvz autoconf-2.63.tar.gz]
Tue Mar 19 12:50:46 +0900 2017
I, [2017-03-19T12:50:46.554764 #10857]  INFO -- : autoconf 2.63 downloaded
I, [2017-03-19T12:50:46.559603 #10857]  INFO -- : Bulding autoconf 2.63
I, [2017-03-19T12:50:46.564565 #10857]  INFO -- : Executing: [./configure --prefix=/opt/sensu/embedded]
I, [2017-03-19T12:51:14.672558 #10857]  INFO -- : Executing: [make]
Tue Mar 19 12:52:10 +0900 2017
I, [2017-03-19T12:52:10.213197 #10857]  INFO -- : autoconf 2.63 built
I, [2017-03-19T12:52:10.218873 #10857]  INFO -- : Installing autoconf 2.63
I, [2017-03-19T12:52:10.222208 #10857]  INFO -- : Executing: [make install]
Tue Mar 19 12:52:36 +0900 2017
I, [2017-03-19T12:52:36.369760 #10857]  INFO -- : autoconf 2.63 is installed
mkdir -p /tmp/build/zlib
I, [2017-03-19T12:52:36.427922 #10857]  INFO -- : Downloading zlib 1.2.11
I, [2017-03-19T12:52:36.433085 #10857]  INFO -- : Executing: [curl -O http://zlib.net/zlib-1.2.11.tar.gz]
I, [2017-03-19T12:52:41.150191 #10857]  INFO -- : Executing: [tar xfvz zlib-1.2.11.tar.gz]
Tue Mar 19 12:52:43 +0900 2017
I, [2017-03-19T12:52:43.342507 #10857]  INFO -- : zlib 1.2.11 downloaded
I, [2017-03-19T12:52:43.347148 #10857]  INFO -- : Bulding zlib 1.2.11
I, [2017-03-19T12:52:43.351134 #10857]  INFO -- : Executing: [mkdir /opt/sensu/embedded/lib]
I, [2017-03-19T12:52:44.571550 #10857]  INFO -- : Executing: [./configure --prefix=/opt/sensu/embedded]
I, [2017-03-19T12:53:06.728397 #10857]  INFO -- : Executing: [make]
Tue Mar 19 12:54:59 +0900 2017
I, [2017-03-19T12:54:59.930870 #10857]  INFO -- : zlib 1.2.11 built
I, [2017-03-19T12:54:59.951891 #10857]  INFO -- : Installing zlib 1.2.11
I, [2017-03-19T12:54:59.955405 #10857]  INFO -- : Executing: [make install]
Tue Mar 19 12:55:03 +0900 2017
I, [2017-03-19T12:55:03.581406 #10857]  INFO -- : zlib 1.2.11 is installed
mkdir -p /tmp/build/openssl
~~~~~~~ 省略 ~~~~~~~
I, [2017-03-19T17:22:55.371406 #10857]  INFO -- : Not building RPM, platform [raspbian] does not support it.
I, [2017-03-19T17:22:55.377854 #10857]  INFO -- : Not building DEB, platform [raspbian] does not support it.

real    272m35.521s
user    216m40.510s
sys     49m31.130s
```

ビルドは時間がかかります。
(私の環境では凡そ4.5時間でした)

## sensu-client の環境構築

```console
sudo useradd -s /bin/false -d /opt/sensu -c "Sensu Monitoring Framework" sensu
chown -R sensu:sensu /etc/sensu
chown -R sensu:sensu /opt/sensu
sudo chown -R sensu:sensu /var/log/sensu
sudo mkdir /var/run/sensu
sudo chown -R sensu:sensu /var/run/sensu
sudo ln -s /etc/os-release /etc/debian_version
sudo vi /etc/systemd/system/sensu-client.service
sudo vi /usr/lib/tmpfiles.d/sensu.conf
sudo chmod 644 /usr/lib/tmpfiles.d/sensu.conf
```

```bash:/etc/systemd/system/sensu-client.service
[Unit]
Description=sensu client

[Service]
User=sensu
Group=sensu
ExecStart=/etc/init.d/sensu-service client start
KillMode=process
Restart=on-failure
RestartSec=1min

[Install]
WantedBy=multi-user.target
```

```bash:/usr/lib/tmpfiles.d/sensu.conf
d /var/run/sensu 0755 sensu sensu
````

ログフォルダもtmpfsにする場合

```bash:/usr/lib/tmpfiles.d/sensu.conf
d /var/run/sensu 0755 sensu sensu
d /var/log/sensu 0755 sensu sensu
````


## sensu-client サービス操作

```console:起動
systemctl start sensu-client
```

自動起動の有効化

```console:自動起動の有効化
systemctl enable sensu-client
```

## sensu-client でvmstat

```console:vmstatプラグインのインストール
sudo /opt/sensu/embedded/bin/gem install sensu-plugins-vmstats
```

※クライアントのrabbitmq設定、サーバ側の設定は割愛

# 参考URL

- [Best Compilation Flags for RPi3 on Raspbian 32 bit?
](https://www.raspberrypi.org/forums/viewtopic.php?f=33&t=144115)