2017年8月28日月曜日

Raspberry Pi + DHT11 + Zabbixによる温度・湿度監視

自宅ではESXiをインストールした検証用PCとQNAPのNASが24時間稼働をしているが、夏の日中帯はクーラーを止めることもあって、室温がかなり高くなっていることが気になっていた。

そこで、Raspberry Piで検証用PC付近の温度と湿度を取得し、Zabbixに連携してグラフ化し、温度監視をすることにした。

必要なもの

Raspberry Pi本体は当然必要となる。導入方法については別記事を参照。

温度・湿度センサーはDHT11を選択した。DHT11は精度はそこまでよくないらしいが、非常に安い。

・DHT11のセンサー
http://amzn.to/2iwkWkH

なお、私はDHT11単体で購入するのではなく、以下のOSOYOOの「電子工作キット」を購入した。この中にはDHT11の他に配線を楽にするブレッドボード等も含まれるので、Raspberry Piでいろいろやる場合は、1個買っておいても損はない。




センサーを接続

それではセンサーを接続していこう。DHT11のPin配置は以下の通りとなる。

 1 VDD
 2 DATA
 3 NC (Not Connected)
 4 GND

Raspberry Piとの接続は、以下の通りとなる。

 1 VDD -> 3V3
 2 DATA -> GPIO17
 3 NC (Not Connected) -> 接続しない
 4 GND -> GND

接続図は以下の通りとなる。


DATAとGPIO17の間にはプルアップ抵抗として、10kΩの抵抗を挟む図となっているが、プルアップ抵抗がはじめから回路に含まれている一体型のDHT11もあり、そちらを利用する場合は不要となる(一体型の場合はNCのPinも省略されて、3Pinで構成されているものが多い模様)。

以下写真は、自宅環境の接続の状況。わかりづらいが、DHT11にあらかじめプルアップ抵抗が付いており、通電するとLEDも点灯する仕様になっている。


Pythonにて温度・湿度取得スクリプトを作成

温度と湿度の取得スクリプトを一から作るのは大変なので、gitを使って元となるスクリプトを入手する。

$ git clone https://github.com/szazo/DHT11_Python.git
------------------------------
Cloning into 'DHT11_Python'...
remote: Counting objects: 48, done.
Unpacking objects: 100% (48/48), done.
Checking connectivity... done.
------------------------------

ファイルを確認すると、dht11.pyとdht11_example.pyの2のスクリプトがある。dht11.pyが本体で、dht11_example.pyから呼び出してセンサーから温度と湿度を取得する、という作りになっている。

$ cd DHT11_Python/
$ ls -l
------------------------------
-rw-r--r-- 1 pi pi 1071  8月 19 13:16 LICENSE.md
-rw-r--r-- 1 pi pi  899  8月 19 13:16 README.md
-rw-r--r-- 1 pi pi    1  8月 19 13:16 __init__.py
-rw-r--r-- 1 pi pi 5969  8月 19 13:16 dht11.py
-rw-r--r-- 1 pi pi  464  8月 19 13:16 dht11_example.py
------------------------------

今回はdht11_example.pyを参考にして、Zabbix連携用のスクリプトを作成する。以下のように、温度、湿度の順でカンマ区切りで表示させるスクリプトを作成した。

$ cat dht11_get_temperature_humidity.py
------------------------------
import RPi.GPIO as GPIO
import dht11

# initialize GPIO
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.cleanup()

# read data using pin 14
instance = dht11.DHT11(pin=17)

result = instance.read()
if result.is_valid():
    print("%d,%d" % (result.temperature, result.humidity))
------------------------------

試しに実行すると、以下の通り温度と湿度が出力された。

$ python dht11_get_temperature_humidity.py
------------------------------
35,31
------------------------------

Zabbix Senderにてデータを送信

Zabbixに対してはZabbix Senderを使い、データ送信を行うこととする。Zabbix Senderを使えるようにあらかじめZabbix Agentをインストールしておこう。インストール方法はこちらを参照。

Zabbix Senderのコマンドの書式は以下の通りとなる。キー名は、別途Zabbix Server側の「アイテム」で設定する際の値と同一にする必要がある。

zabbix_sender -z <Zabbix ServerのIPアドレス> -s <ホスト名> -k <キー名> -o <値>

上記zabbix_senderを使って、温度・湿度情報を送信するシェルスクリプトを以下のように作成した。内容としては、Pythonのスクリプトで得られた温度・湿度情報をZabbix Senderの値に入れて飛ばすだけの簡単なものになっている。

$ cat get_temperature.sh
------------------------------
#!/bin/bash

home_dir="/home/pi/DHT11_Python"

value=$(python $home_dir/dht11_get_temperature_humidity.py)
echo $value
zabbix_sender -z 192.168.33.22 -s t3015rasp -k rasp_temp -o $(echo $value | cut -d"," -f 1)
zabbix_sender -z 192.168.33.22 -s t3015rasp -k rasp_humi -o $(echo $value | cut -d"," -f 2)

exit 0
------------------------------

上記スクリプトを5分間隔で実行するよう、crontab -eコマンドにて以下行を登録する。

$ crontab -l
------------------------------
*/5 * * * * /home/pi/DHT11_Python/get_temperature.sh
------------------------------

cronの設定反映のため、サービスを再起動しておく。

$ sudo systemctl restart cron.service

Zabbix Serverにてグラフ化と監視トリガーを設定

最後にZabbix Server側で受信設定を行う。

1. アイテムの作成

温度用のアイテムと湿度用のアイテムの2つを作成する。

------------------------------
◆温度用
・名前:Sensor Temperature
・タイプ:Zabbixとラッパー
・キー:rasp_temp
・データ型:数値 (浮動小数)
・単位:℃
・アプリケーション:Sensor (「アプリケーションの作成」で作成する)
------------------------------


------------------------------
◆湿度用
・名前:Sensor Humidity
・タイプ:Zabbixとラッパー
・キー:rasp_humi
・データ型:数値 (浮動小数)
・単位:%
・アプリケーション:Sensor
------------------------------


2. グラフの作成

1つのグラフで温度と湿度を両方表示できるようにする。

------------------------------
・名前:Temperature & Humidity
・アイテム 1: Template OS Raspbian: Sensor Temperature / Y軸:左
・アイテム 2: Template OS Raspbian: Sensor Humidity / Y軸:右
------------------------------


3. トリガーの作成

温度に関しては高温度となった際に、Zabbixでアラートとして検知できるように、トリガーを作成する。

------------------------------
・名前:High Temperature
・条件式:{Template OS Raspbian:rasp_temp.last()}>37
     ※下線部は監視閾値としたい温度に適宜変更する
・深刻度:軽度の障害
------------------------------


4. グラフの確認

最後にグラフが正常に表示されることを確認する。赤線が温度で緑線が湿度となる。以下の図は一週間ほど値を取得した結果のグラフとなる。設置場所が検証用PCやNASの近くなので、温度が常に30℃以上と高めとなっている。


非常に当たり前の結果ではあるが、人が外出する日中は温度・湿度が上昇し、帰宅後クーラーをONにすると温度・湿度が急激に下がるということがわかった。

以上で、Raspberry Piを使って、温度・湿度センサーによる監視を実現することができた。今後は、取得した温度・湿度情報をもとに、クーラーや扇風機を制御できるようにしたいとも考えている。

参考

・DHT11 (Raspberry Pi) by piddlerintheroot in raspberry-pi

2017年8月24日木曜日

Raspberry PiにZabbix Agentをインストールする

Raspberry Piで取得したセンサー情報をZabbixに連携して監視できるようにしたいと思い、とりあえずZabbix Agentをインストールすることにした。

今回使用するRaspberry PiのOSはRaspbianとなり、バージョンは以下となる。

$ lsb_release -a
------------------------------
No LSB modules are available.
Distributor ID: Raspbian
Description:    Raspbian GNU/Linux 8.0 (jessie)
Release:        8.0
Codename:       jessie
------------------------------

apt-getで簡単インストール

Raspbianへのzabbix-agentはapt-getで簡単にインストールできる。

$ sudo apt-get install zabbix-agent
------------------------------
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています       
状態情報を読み取っています... 完了
以下の追加パッケージがインストールされます:
  libpci3 pciutils
以下のパッケージが新たにインストールされます:
  libpci3 pciutils zabbix-agent
アップグレード: 0 個、新規インストール: 3 個、削除: 0 個、保留: 0 個。
595 kB のアーカイブを取得する必要があります。
この操作後に追加で 1,883 kB のディスク容量が消費されます。
続行しますか? [Y/n] y

~(中略)~

libpci3:armhf (1:3.2.1-3) を設定しています ...
pciutils (1:3.2.1-3) を設定しています ...
zabbix-agent (1:2.2.7+dfsg-2+deb8u3) を設定しています ...

Creating config file /etc/zabbix/zabbix_agentd.conf with new version
libc-bin (2.19-18+deb8u10) のトリガを処理しています ...
systemd (215-17+deb8u7) のトリガを処理しています ...
------------------------------

バージョンを確認すると、2.2.7となっていた。2014年10月の記載があり、予想よりも古いエージェントがインストールされるという印象。

$ zabbix_agentd -V
------------------------------
Zabbix Agent (daemon) v2.2.7 (revision 50148) (24 October 2014)
Compilation time: Aug 12 2017 04:46:02
------------------------------

apt-getが使えない場合のインストール (※未検証)

インターネットへの接続ができずapt-getによるインストールができない場合は、直接ファイルを落としてインストールする。ダウンロード先は以下となる。

http://mirrordirector.raspbian.org/raspbian/pool/main/p/pciutils/
libpci3_3.2.1-3_armhf.deb
pciutils_3.2.1-3_armhf.deb

http://mirrordirector.raspbian.org/raspbian/pool/main/z/zabbix/
zabbix-agent_2.2.7+dfsg-2+deb8u3_armhf.deb

上記3つのファイルをダウンロードして、"dpkg -i"でインストールすればよいはず。

$ sudo dpkg -i libpci3_3.2.1-3_armhf.deb
$ sudo dpkg -i pciutils_3.2.1-3_armhf.deb
$ sudo dpkg -i zabbix-agent_2.2.7+dfsg-2+deb8u3_armhf.deb

Zabbix Agentの初期設定

/etc/zabbix/zabbix_agentd.confに必要な設定を記載する。この設定ファイルはコメント行も含めると、かなり長いものとなっているが、実際に必要な設定は以下のみとなる。

$ cat /etc/zabbix/zabbix_agentd.conf | grep -v -e "^#" -e "^$"
------------------------------
PidFile=/var/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix-agent/zabbix_agentd.log
LogFileSize=1
Server=<Zabbix ServerのIPアドレス>
ServerActive=<Zabbix ServerのIPアドレス>
Hostname=<Agetn側のホスト名 ※Zabbix Serverに登録するホスト名と合わせる>
AllowRoot=1   ←★注
Include=/etc/zabbix/zabbix_agentd.conf.d/
------------------------------

注) AllowRoot=1はZabbix Agentをroot権限で実行する設定となり、セキュリティ上は非推奨の設定となる。しかし、ログ監視の対象ログがroot以外読み取り不可となっている場合(/var/log/messagesなど)は監視ができなくなるため、あえて有効にしている。当然、そのような監視が不要であれば設定しない方がよい。

------------------------------
★(2018/3/28追記)
上記について、AllowRoot=1せずに監視する方法を別記事で記載した。

ZabbixでAllowRoot=1をせずに/var/log/messagesなどを監視する方法
https://tech-mmmm.blogspot.jp/2018/03/zabbixallowroot1varlogmessages.html
------------------------------

設定が終わったら、Zabbix Agentを再起動する。

$ sudo systemctl restart zabbix-agent.service

Zabbix Server側の監視設定

次にZabbix Server側でホストの登録を行う。

まずは、Raspbian用のテンプレートとして、「Template OS Raspbian」を作る。といっても、RaspbianはLinuxなので、Zabbixに標準で存在するTemplate OS Linuxにリンクするだけで完成。このテンプレートをベースに将来的にRaspbian特有の監視設定を追加できるようにする。


次に、ホストの登録を行う。ホスト名とIPアドレスを正しく設定し、テンプレートタブにて先ほど作成した「Template OS Raspbian」とリンクすればよい。



これで問題なければ監視ができるはず。試しに最新データを見てみると、以下の通り各種情報の取得に成功していることがわかる。



2017年8月20日日曜日

Linuxの設定ファイルの#から始まるコメント行を消して設定値だけ表示する

Linuxの設定ファイルは、コメント行として#から始まる行が多数記載されている。設定値の意味が記載されており、あれば便利なものではあるが、実際に設定した内容の確認の際には視認性が悪くなるため、邪魔になることも多い。

というわけで、grepでコメント行を消すことを試してみた。

コメント行を消す方法

例として以下のようなテキストファイルを用意してみた。

$ cat test.txt
------------------------------
# comment1

test # comment2


test "####"


 # comment3

  # comment4
   # comment5
------------------------------

コメント行を削除するには以下の通りgrepする。

$ cat test.txt | grep -v '^ *#'
------------------------------

test # comment2

test "####"

------------------------------

さらに空白行も消したい場合は、以下の通りとなる。通常使う場合は、空白行も消した方が視認性がよいのでお勧め。

$ cat test.txt | grep -v -e '^ *#' -e '^$'
------------------------------
test # comment2
test "####"
------------------------------

catを使わず以下の記述でもOK。

$ grep -v '^ *#' test.txt
$ grep -v -e '^ *#' -e '^$' test.txt

エイリアスを作っておく

便利なコマンドなのでエイリアスを登録してすぐに使えるようにしておく。~/.bashrcに以下行を追記すればよい。エイリアスの名前は任意だが、コメント(comment)を取って表示する(cat)ということで、「ccat」としてみた(実際はcatは表示するという意味ではないが)。

alias ccat="grep -v -e '^ *#' -e '^$'"

~/.bashrcの記載方法について補足となるが、UbuntuやRaspbianのようなDebian系のLinuxでは、~/.bashrcを覗くと以下のような記載になっていた。

------------------------------
# Alias definitions.
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
# See /usr/share/doc/bash-doc/examples in the bash-doc package.

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi
------------------------------

どうやら「~/.bash_aliases」のファイルを作成して、そこにエイリアスを書け、ということらしい。郷に入っては郷に従えということで、そのように対応した。

$ cat ~/.bash_aliases
------------------------------
alias ccat="grep -v -e '^ *#' -e '^$'"
------------------------------

参考

みんな考えていることは同じだった。

https://www.google.co.jp/search?q=grep+%E3%82%B3%E3%83%A1%E3%83%B3%E3%83%88

2017年8月18日金曜日

Xubuntu 16.04にxrdpを使ってRDPでリモートデスクトップ接続をする

LinuxをデスクトップPCとして使いたいと思いXubuntuを使ってみることにした。なぜXubuntuを選択したかというと、Ubuntuの標準デスクトップ環境であるUnityが個人的に使いづらかったというのが理由となる。

Linuxに対してリモートデスクトップ接続する場合は、VNCを使うのが昔は一般的だったが、今ではWindowsのRDP (Remote Desktop Protocol)によるリモートデスクトップ接続も簡単にできるようになったので、その方法を記載する。

xrdpのインストール

apt-getを使ってxrdpをインストールするだけで、簡単にRDPでリモートデスクトップ接続できるLinuxができあがる。

# apt-get install xrdp
------------------------------
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下の追加パッケージがインストールされます:
  vnc4server xbase-clients
提案パッケージ:
  vnc-java x11-xfs-utils
以下のパッケージが新たにインストールされます:
  vnc4server xbase-clients xrdp
アップグレード: 0 個、新規インストール: 3 個、削除: 0 個、保留: 3 個。

~(中略)~

xrdp (0.6.1-2) を設定しています ...
systemd (229-4ubuntu19) のトリガを処理しています ...
ureadahead (0.100.0-19) のトリガを処理しています ...
------------------------------

試しに、Windowsマシンから「リモートデスクトップ接続」を使ってXubuntuにRDP接続をしてみる。いつもと違う警告が表示されるものの、特に問題なく接続できた。

ちなみにバージョンを確認すると、0.6系となっており、最新版は0.9系であるため、古いバージョンとなっている。

# xrdp --version
------------------------------
xrdp: A Remote Desktop Protocol server.
Copyright (C) Jay Sorg 2004-2011
See http://xrdp.sourceforge.net for more information.
Version 0.6.1   ←★バージョンが古い
------------------------------

最新版をインストールするには以下URLのスクリプトを使ってコンパイルしてインストールするらしいのだが、コンパイルが途中で失敗するため頓挫した。

・日本xrdpユーザ会 - X11RDP-o-Matic
https://xrdp.vmeta.jp/X11RDP-o-Matic

キーボード配列を日本語配列で認識させる

xrdpでログインして、ターミナルなどを開いて「shift+2」などを押すとわかるが、「"」ではなく「@」と表示されてしまう。これは、キーボード配列を英語配列で認識してしまっていることが原因のようだ。このままでは漢字変換もできない状態となるため、修正を行う。

日本語配列に変更する場合は、まず、以下URLから「km-0411.ini」というファイルをダウンロードする。

・日本xrdpユーザ会 - キー配列について
https://xrdp.vmeta.jp/%E3%82%AD%E3%83%BC%E9%85%8D%E5%88%97%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6

ダウンロードしたファイルを/etc/xrdp直下に配置する。

# cd /etc/xrdp
# ls -l
------------------------------
合計 100
-rw-r--r-- 1 xrdp xrdp 8756 10月 26  2014 km-0407.ini
-rw-r--r-- 1 xrdp xrdp 8655 10月 26  2014 km-0409.ini
-rw-r--r-- 1 xrdp xrdp 8744 10月 26  2014 km-040c.ini
-rw-r--r-- 1 xrdp xrdp 8732 10月 26  2014 km-0410.ini
-rw-r--r-- 1 root root 8703  8月 14 15:40 km-0411.ini   ←★これを配置
-rw-r--r-- 1 xrdp xrdp 9169 10月 26  2014 km-0419.ini

~(以下略)~
------------------------------

他ファイルとオーナーを合わせた後、別名でシンボリックリンクを張る。

# cd /etc/xrdp
# chown xrdp:xrdp km-0411.ini
# ln -s km-0411.ini km-e0200411.ini
# ln -s km-0411.ini km-e0010411.ini

最後にxrdpを再起動して反映させれば完了。

# systemctl restart xrdp

ターミナルでTAB補完を使えるようにする

xrdpでログインし、ターミナルを開いてコマンドのTAB補完を試みると、なぜか動作せず、ウィンドウの切り替え動作をしてしまう事象が発生した。

対処方法は、ホームディレクトリ~/.config/xfce4/xfconf/xfce-perchannel-xmlのファイルを以下の通り修正する。

------------------------------
修正前:       <property name="&lt;Super&gt;Tab" type="string" value="switch_window_key"/>
修正後:       <property name="&lt;Super&gt;Tab" type="empty"/>
------------------------------

実際に接続してみる

Windowsのリモートデスクトップ接続を使って、xrdpをインストールしたLinuxのIPアドレスに接続すると、以下のようなログイン画面が表示されるので、ユーザーとパスワードを入力してログインする。


以下の通り、XubuntuのXfceのデスクトップ環境が表示された。


2017年8月12日土曜日

Apache HTTP Server 2.2をrpmからインストールする

検証のためにApache HTTP Server (httpd)をRHEL 6にインストールしようとした際に、微妙に依存関係のあるパッケージが多く、依存関係の解消が面倒だったので、忘れないようにメモしておく。

環境としては、RHEL 6.5を「基本サーバー」としてインストールしたものとなる。

インストール手順

まず、RHELのOSメディアをマウントする。今回はESXi 6.0の仮想化環境となるが、CD-ROMとしてマウントしているので、読み込み専用の旨のメッセージが表示される。

# mount /dev/cdrom /mnt
------------------------------
mount: ブロックデバイス /dev/sr0 は書き込み禁止です、読込み専用でマウントします
------------------------------

OSメディア内のPackagesフォルダにある、Apache HTTP Server (httpd)をインストールしてみると、なにやら4つほど依存関係のメッセージが表示されインストールに失敗する。

# cd /mnt/Packages
# rpm -ivh httpd-2.2.15-29.el6_4.x86_64.rpm
------------------------------
警告: httpd-2.2.15-29.el6_4.x86_64.rpm: ヘッダ V3 RSA/SHA256 Signature, key ID fd431d51: NOKEY
エラー: 依存性の欠如:
        apr-util-ldap は httpd-2.2.15-29.el6_4.x86_64 に必要とされています
        httpd-tools = 2.2.15-29.el6_4 は httpd-2.2.15-29.el6_4.x86_64 に必要とされています
        libapr-1.so.0()(64bit) は httpd-2.2.15-29.el6_4.x86_64 に必要とされています
        libaprutil-1.so.0()(64bit) は httpd-2.2.15-29.el6_4.x86_64 に必要とされています
------------------------------

上記依存関係を解消するためには、以下の通りパッケージをインストールしていけばよい。postgresql-libsが必要となるところがわかりづらい。

# rpm -ivh postgresql-libs-8.4.18-1.el6_4.x86_64.rpm
# rpm -ivh apr-1.3.9-5.el6_2.x86_64.rpm
# rpm -ivh apr-util-1.3.9-3.el6_0.1.x86_64.rpm
# rpm -ivh apr-util-ldap-1.3.9-3.el6_0.1.x86_64.rpm
# rpm -ivh httpd-tools-2.2.15-29.el6_4.x86_64.rpm

上記インストール後、再度httpdのインストールを試みると、以下の通り成功するはず。

# rpm -ivh httpd-2.2.15-29.el6_4.x86_64.rpm
------------------------------
警告: httpd-2.2.15-29.el6_4.x86_64.rpm: ヘッダ V3 RSA/SHA256 Signature, key ID fd431d51: NOKEY
準備中...                ########################################### [100%]
   1:httpd                  ########################################### [100%]
------------------------------

人気の投稿