Grafana+InfluxDBv2+telegrafで室内温度を可視化する

サーバー

以前に部屋の温度を取得するように設定した。

2020/03/22 部屋の温度を監視したい4 -discordに通知- - izuminの記録
部屋の温度を監視したいその4 2020/03/20 部屋の温度を監視したい3 -グラフ化-←前回 前回の続き。 一部修正した。 5分間隔で実行→10分間隔で実行 5分間隔では多すぎてグラフが読みにくい。 15分でもいいけどとりあえず10分で...

この温度を外出先からでも見やすくするためにクラウドにデータを置くように設定を行ってみる。
温度だけでなく、ラズパイのリソースやその他Flowデータなど様々なデータをクラウドに置くようにする予定。
また、どこからでも見えるようにNginxで待ち受け、クライアント証明書による認証を行う。
クライアント証明書は試したことなかったのでやってみたいだけ。

構成

構成は上の通り。GCPにDocker-composeを利用してInfluxdbとGrafanaを構築する。
Nginxではオレオレ証明書でHTTPS化とクライアント証明書による認証の設定を入れる。
Grafanaコンテナは3000:8080でポート変換を行う。Influxdbは8086でListen.
自宅側ではtelegrafのSocket Listenerプラグインでデータを取得し、整形してInfluxdbに送る。

構築

Nginxの設定

Nginxのインストール

Nginxの構築は公式の通りインストールする。

オレオレ証明書の作成

CA用のディレクトリを作成する

# cd /etc/ssl
# sudo mkdir CA

秘密鍵の作成

# openssl genrsa -out CA.key 2048

CSRの作成

# openssl req -new -key CA.key -out CA.csr

CAの証明書(ルート証明書)作成。

# openssl x509 -days 3650 -in CA.csr -req -signkey CA.key -out CA.crt
// ルート証明書の作成。自分の秘密鍵で署名する。

サーバ証明書作成のための準備

# touch index.txt
# touch index.txt.attr
# echo 00 > serial

OpenSSLのコンフィグの設定

# cp -p /etc/ssl/openssl.cnf /etc/ssl/openssl.cnf.bak
# vim /etc/ssl/openssl.cnf
[ CA_default ]
dir = /etc/ssl/CA
certificate = $dir/CA.crt
private_key = $dir/CA.key
[ usr_cert ]
subjectAltName = @alt_names

サーバ証明書の作成

# cd /etc/ssl
# mkdir -p certs/<domain>
# cd certs/<domain>
# openssl genrsa -out server.key 2048
# openssl req -new -key server.key -out server.csr
~
# vim san.ext
subjectAltName=DNS:<domain>
# openssl ca -in server.csr -out server.crt -days 3650 -extfile san.ext

クライアント証明書の作成

# cd /etc/ssl
# mkdir client_cert
# cd client_cert
# openssl genrsa -out client.key 2048
# openssl req -new -key client.key -out client.csr
# openssl x509 -req -days 3650 -in client.csr -CA /etc/ssl/CA/CA.crt -CAkey /etc/ssl/CA/CA.key -set_serial 01 -out client.crt
# openssl pkcs12 -export -out client.pfx -inkey client.key -in client.crt -certfile /etc/ssl/CA/CA.crt
//その後client.pfxをデバイスで読み込む

Nginxのコンフィグ

listen 443 ssl default_server;
ssl_certificate      /etc/nginx/ssl/certs/<domain>/server.crt;
ssl_certificate_key  /etc/nginx/ssl/certs/<domain>/server.key;
# client cert
ssl_verify_client on;
ssl_client_certificate /etc/ssl/client_cert/client.crt;

/リバプロの設定も行う。これは省略
Grafana+Influxdbの構築

Influxdbはversion2.0

Grafana+InnfluxdbはDocker-composeで動かす。
まずはdocker-compose.ymlファイルを作成。
volumesで紐付けたディレクトリが無いと動かないのでディレクトリも作成する。

version: "3"

services:
  influxdb:
    image: influxdb:2.0.4-alpine
    container_name: local-influxdb
    hostname: local-influxdb
    volumes:
      - /home/<user>/docker_data/influxdb_data:/var/lib/influxdb2
      - /home/<user>/docker_data/influxdb_config:/etc/influxdb2
    ports:
      - 8086:8086
    environment:
      - DOCKER_INFLUXDB_INIT_MODE=setup
      - DOCKER_INFLUXDB_INIT_USERNAME=hogeuser
      - DOCKER_INFLUXDB_INIT_PASSWORD=hogepass
      - DOCKER_INFLUXDB_INIT_ORG=hogeorg
      - DOCKER_INFLUXDB_INIT_BUCKET=hogebucket
  grafana:
    image: grafana/grafana
    container_name: grafana
    ports:
      - 8080:3000 
    user: "0:0"
    volumes:
      - /home/<user>/docker_data/grafana_data:/var/lib/grafana    
    depends_on:
      - influxdb
    environment:
      - GF_SERVER_ROOT_URL=http://localhost:8080
      - GF_SECURITY_ADMIN_PASSWORD=admin

influxdbのenvironmentに書いておくことでsetupする必要がなくなる。

起動する。

# docker-compose run -d
# docker-compoes ps
     Name               Command           State                    Ports                  
------------------------------------------------------------------------------------------
grafana          /run.sh                  Up      0.0.0.0:8080->3000/tcp,:::8080->3000/tcp
local-influxdb   /entrypoint.sh influxd   Up      0.0.0.0:8086->8086/tcp,:::8086->8086/tcp

起動が完了するとvolumesの~/docker_data/influxdb_config/influx-configsが作成されているため表示。

# cat ~/docker_data/influxdb_config/influx-configs
[default]
  url = "http://localhost:8086"
  token = "TOKENTOKENTOKENTOKEN"
  org = "hogeorg"
  active = true

このtokenは後ほど使うため覚えておく。
NginxでリバプロでこのGrafanaを宛先と指定していたらWebからログインができる。

Webでアクセスするとクライアント証明書の選択が求められる。

選択してOKを押すとGrafanaが表示される。
Dockerで初回パスワードを設定していたので初期パスワードはadmin
admin/adminでログイン。

Add data sourceからInfluxdbを追加する。

Query LanguageはFluxを選択
URLはドメインに注意。同じマシン内ではあるがコンテナなのでコンテナ名を指定。

Organization, Default Bucketを入力し、Tokenは覚えておいたものを入力。

Telegrafの構築

TelegrafもDockerで動かす。
Docker-compose.yamlを編集

version: "2"

services:
    telegraf:
        image: telegraf:1.18
        container_name: telegraf
        restart: always
        volumes:
            - /home/<user>/docker-compose/telegraf/telegraf.conf:/etc/telegraf/telegraf.conf:ro
        ports:
            - "8092:8092/udp"
        environment:
            - TZ=Asia/Tokyo

telegrafのコンフィグを変更する。
ここではデータのインプットとアウトプットの設定を行う。

# vim ./telegraf.conf
[[inputs.socket_listener]]
   service_address = "udp://:8092
   data_format = "influx" //influx Line Protocolによるフォーマット

[[outputs.influxdb_v2]]
   token = "TOKENTOKENTOKENTOKEN"
   organization = "hogeorg"
   bucket = "hogebucket"

コンテナを起動する

$ docker-compose up -d
Creating telegraf ... done
$ docker ps
CONTAINER ID   IMAGE   COMMAND    CREATED     STATUS      PORTS       NAMES
5e76336f67ec  telegraf:1.18  "/entrypoint.sh tele…"  7 seconds ago    Up 4 seconds    0.0.0.0:8092->8092/udp, 8094/tcp, 8125/udp   telegraf

$ docker-compose logs
Attaching to telegraf
telegraf    | 2021-05-03T09:46:13Z I! Starting Telegraf 1.18.2
telegraf    | 2021-05-03T09:46:13Z I! Using config file: /etc/telegraf/telegraf.conf
~省略~
telegraf    | 2021-05-03T09:46:13Z I! [inputs.socket_listener] Listening on udp://[::]:8092

コンテナが起動できたらホストOSは8092/UDPでListenを開始する。
ここにデータを投げる設定を行う。

データの送信

以前にデータを取得するところまでは行っていたので一部修正するだけ。
telegrafはInflux Line Protocolでデータを取り込むため、その形式で8092/UDPに投げてあげる。
データの形式にについては下の記事を参照

Line protocol | InfluxDB OSS 2.0 Documentation
InfluxDB uses line protocol to write data points. It is a text-based format that provides the measurement, tag set, fiel...

自分はかなり単純に
echo '<measurement> temperature=<temp>,humidity=<hum>' | nc -4 -u -w 1 <host> 8092
のように、Influx Line Protocol構文をncコマンドで渡しているだけ。
これを10分毎にcrondで定時実行する。

Grafanaのグラフを変更

Grafanaにログインし、Create Dashboardを選択する。
Add new pannelを選択すると

Flux構文というのはよくわからないが、下にサンプルとSyntaxのドキュメントがあるのでそこを参考。

自分の場合は以下の通り

ここで気づいたのがContainerIDが識別に使われている。
ここは後で修正しなければならない。
あとはいい感じに調整して完成


コンテナを再起動したら別ホストのデータとして認識されてしまったのでここは後で修正。
あとはSNMPやFlowデータなんかもここに集約できたらいいなと考え中。
それはまた別の機会に。

以上

コメント

タイトルとURLをコピーしました