RaspberryPi2 のセンサーで取得したメトリクスを Mackerel に出力する ansible プレイブック

はじめに

1月から東京に移住したが、実家においてきた RaspberryPi2 のメトリクスを見る手段がなかった。
メトリクスは RaspberryPi 内にしか蓄積しておらず、アラートだけ Slack & LINE で送っていた。

過去にやったことは以下の記事。


今回は東京からメトリクスを見れるようにするための取り組み。

最近 Mackerel Meetup #10 に参加した縁もあるので、Mackerel 使ってみましたよ、というだけの話。


実装

RaspberryPi2 いじるのは年に数回なので、構成を後から追えるようにするために、最初からではないのだが ansible でデプロイできるようにしている。
なので、以下プレイブックベースで書く。

ベースの処理

ここでは温度・湿度の記録部分しか書かないが、実際は見守りカメラの反応の有無も録っているため、 yml を分けてある。
role でディレクトリ管理してなくて雑な運用。

main.yml

- hosts: pi
  sudo: yes
  vars:
    colon: ':'
  tasks:
    - include: tasks/base.yml
    - include: tasks/temperature.yml
  handlers:
    - name: restart mackerel-agent
      service: name=mackerel-agent state=restarted

hosts

[pi]
xxx.xxx.xxx.xxx

[pi:vars]
ansible_connection=paramiko
ansible_ssh_user=pi
ansible_ssh_pass=xxxxxxx
ansible_sudo_pass=xxxxxxx
mackerel_apikey=xxxxxxxx

mackerel-agent のインストール

RaspberryPi2 では ARM 版のバイナリが必要なため、インストールした後にバイナリを上書きしている。
API Key も流し込む

tasks/base.yml

- name: install mackerel-agent
  shell: |
    curl -O https://mackerel.io/file/agent/deb/mackerel-agent_latest.all.deb
    dpkg -i mackerel-agent_latest.all.deb
    curl -LOk https://github.com/mackerelio/mackerel-agent/releases/download/v0.42.3/mackerel-agent_linux_arm.tar.gz
    tar zxf mackerel-agent_linux_arm.tar.gz
    cp mackerel-agent_linux_arm/mackerel-agent /usr/bin
  args:
    creates: /etc/mackerel-agent/mackerel-agent.conf

- name: mackerel-agent conf
  lineinfile: 
    dest=/etc/mackerel-agent/mackerel-agent.conf
    line='{{ item.line }}'
    regexp='{{ item.regexp }}'
  with_items:
    - { line: 'apikey="{{ mackerel_apikey }}"', regexp: '^apikey="{{ mackerel_apikey }}"' }
  notify: restart mackerel-agent

温度・湿度のメトリクス取得

公式ドキュメントを読めばわかるとおり、mackerel-agent.conf にコマンドを書いて、コマンド内でメトリクスを標準出力に出せば完了。

ホストのカスタムメトリックを投稿する - Mackerel ヘルプ

tasks/temperature.yml

- name: mackerel temperature plugin
  copy: 
    src=mackerel-temperature.sh
    dest=/home/pi/mackerel-temperature.sh
    mode=755

- name: mackerel humidity plugin
  copy: 
    src=mackerel-humidity.sh
    dest=/home/pi/mackerel-humidity.sh
    mode=755

- name: mackerel-agent conf
  lineinfile: 
    dest=/etc/mackerel-agent/mackerel-agent.conf
    line='{{ item.line }}'
    regexp='{{ item.regexp }}'
  with_items:
    - { line: '[plugin.metrics.temperature]', regexp: '^\[plugin.metrics.temperature\]' }
    - { line: 'command = "/home/pi/mackerel-temperature.sh"', regexp: '^command = "/home/pi/mackerel-temperature.sh"' }
    - { line: '[plugin.metrics.humidity]', regexp: '^\[plugin.metrics.humidity\]' }
    - { line: 'command = "/home/pi/mackerel-humidity.sh"', regexp: '^command = "/home/pi/mackerel-humidity.sh"' }
  notify: restart mackerel-agent

自分の場合は以下のサンプルコードをそのまま利用しているので、センサーからの取得処理は実装方法や RaspberryPi のピン番号によって異なる。

https://github.com/adafruit/Adafruit_Python_DHT

files/mackerel-humidity.sh

#!/bin/bash

name="humidity.raspberrypi"
humidity=`/home/pi/Adafruit_Python_DHT/examples/Adahumit.py 22 4`
date=`env TZ=JST date +%s`

echo -e "${name}\t${humidity}\t${date}"

files/mackerel-temperature.sh

#!/bin/bash

name="temperature.raspberrypi"
temperature=`/home/pi/Adafruit_Python_DHT/examples/Adatemp.py 22 4`
date=`env TZ=JST date +%s`

echo -e "${name}\t${temperature}\t${date}"

mackerel 画面

左から湿度、見守りカメラの反応、温度となっている。

f:id:khei-fuji:20170430145710p:plain

センサーの負荷の問題か、mackerel-agent のタイムアウトが短いためか、取得に失敗することがときどきあり、グラフがぶつ切りになってしまっている。
このあたりはもうちょっと時間があるときに調べたい。

感想

認証を考慮して情報を見える化する場として、Mackerel のような SaaS はありがたい。
(フリー版で事足りてしまうので、Mackerel のビジネス的には貢献できないが・・)

1年くらい運用していて Raspberry Pi の問題は無線LANの再接続くらいしか起きていなかったが、Mackerel によって RaspberryPi ホストも監視できるようになったので、より運用しやすい状況が作れたのでよかった。