Raspberry Pi 端末の起動・停止時に、MacOS X のデスクトップ上で端末の IP アドレスを表示したりする方法を試したのでメモがてら。
後ろ側で動いているのは Serf です。端末起動時に Serf が起動時、自動的にネットワークに接続します。その時のイベントハンドラで、画面に通知する仕組みを検証しました。
三行でまとめると:
- Raspberry Pi は DHCP で起動させると、IP 確認が面倒
- 起動時、手許の MaxOS X 上に通知させたい(ダイアログ・警告音・音声)
- 後ろで serf を使って実現
※ 私は Raspberry Pi で実現したかったのですが、DHCP クライアント上で走る VM などでも、同じように情報を拾えると思います。
■背景と機能
自宅のテスト LAN 環境は Mac mini が1台。ここに Raspberry Pi の環境を今後増やしていく予定。Raspberry Pi は、Pidora をセットアップ済み(参考:Raspberry Pi に pydora 18 をセットアップする手順)。IP アドレスを固定ではなく、DHCP にしている。
そのため、Raspberry Pi 端末にアクセスするためには、都度、ディスプレイをつなぎ、キーボードでコンソールログインし、ifconfig を叩かなくてはいけない。正直、非常に面倒である。今後は台数増えるだろうし、無駄に管理に手間をかけたくない。
なんとか簡単に把握できる方法は無いだろうか。加えて、Mac mini 以外の環境からも、監視用途などで Raspberry Pi サーバ群を監視する事も検討。どうしたものか…。
そこに、Serf を使うという考えがビビッと。丁度いくつか Serf の機能を検証していたので( ver 2.0 について、munin-nodeの追加削除)使えそうだと確信。
Serf は、ノードにメンバが追加 ( join ) した時点や離れた時点 ( leave / fail )で、任意のスクリプトを実行させることができる(イベントハンドラ)。
この機能を利用し、画面に IP アドレス・ホスト名を表示できれば、管理が楽になるだろうと。
あとは、重要な所として、余計なお金をかけたくない…のと、 LED 表示とか RasPi 本体から音を鳴らすアイディアは良いとおもうけれど、リモートからは確認できないので。
以下、実装までの記録φ(..)メモメモ
■Mac側の設定
Mac 側では、serf をダウンロードして、適当な場所に展開。serf のバイナリは、自分の場合は /Users/zem/develop/serf/serf に設置。
次に、serf 設定ファイル /Uesrs/zem/develop/serf/raspi.conf を作成。
{ "role": "manager", "node_name": "mac", "log_level": "debug", "event_handlers": [ "/Users/zem/develop/serf/raspi-notice.sh" ] }
serf v.0.2.0 以降は、外部ファイルが指定できるようになったのでフル活用(詳細は先日の記事を参照)。イベントハンドラ(event_handlers)で raspi-notice.sh を実行する。
あとは、実行できるように
$ chmod 755 ./raspi-notice.sh
パーミッションを設定。それから serf を起動。
$ ./serf agent -config-file=./raspi.conf
以上で、Mac 側の準備は完了。
■Raspberry Pi 側の設定
クライアント側でも serf を設定します。設定方針は、以下の通り。
- boot 時かつネットワーク疎通後、serf を自動起動
- Mac ( 192.168.21.3 :固定 ) に join する
なお、設定及び確認は Pidora ( Fedora 18 ベースのカレントバージョン)で行いました。以下手順は Pidora 上のものです。が、Rasberian や Arch Linux などでも、エージェントとして自動起動を行えば、動作すると思います。
まずはじめに、serf を /usr/local/bin/serf へ設置します。
次に、設定ファイルを /usr/local/etc/serf-raspi-client.conf に設置します。
{ "role": "raspi", "node_name": "raspi01.pocketstudio.net", "log_level": "debug", "start_join": [ "192.168.21.3" ] }
node_name 等は、任意のものに書き換えます。start_join は serf 起動時に自動接続する所です。192.168.21.3 は、Mac が動いている環境です。
次に、サーバのブート時に、自動的に serf を起動する設定を行います。Pidora では systemd が動いているので、ネットワーク認識後に serf が動作するよう調整が必要です。詳しくは、次のページを参照ください。
【Serf】systemdでserfを自動起動する方法 | Pocketstudio.jp log3
http://pocketstudio.jp/log3/2013/11/06/howto_run_serf_with_systemd/
先のページの設定を追えたら /etc/systemd/system/serf.service の追加編集をします。serf のオプションで設定ファイルを明示します( -config-file= )。
[Unit]
Description=Serf agent
Requires=NetworkManager-wait-online.service
After=NetworkManager-wait-online.service
[Service]
Type=simple
Restart=always
ExecStart=/usr/local/bin/serf agent -config-file=/usr/local/etc/serf-raspi-client.conf
User=nobody
Group=nobody
[Install]
WantedBy=multi-user.target
あとは、設定を再読込し、serf を起動します。
# systemctl --system daemon-reload # systemctl start serf
正常に起動し、serf の members に加わることが出来れば、Mac OS 上にホスト名や IP アドレスの情報が表示されます。
次は停止もテストします。
# systemctl stop serf
問題無ければ、今度は Mac 上でクライアントがいなくなったと表示されます。
あとは、RasPi 機を reboot して、正常に機能するかどうか、改めて確認します。
なお、raspi-notice.sh では、画面にダイアログを表示させています。補足点としては、
- activate をコメントアウトすると、ポップアップが目立たなくなる
- say を使えば、IP アドレスやホスト名を喋らせることができる
- beep はアラートを鳴らす(回数で気がつかせる方法もあり?)
このように、必要に応じてスクリプトの中を書き換えて運用することもできます。
■振り返りと今後
当初の目的は serf のお陰で簡単に実現できました。serf がなくても、スクリプトを使えば出来るのですが、環境がスケールすることを前提にすると、なかなか難しいのではないでしょうか。今回の例では、ホスト側 Mac が固定 IP アドレスですが、今後は IP アドレスが変わるかもしれません。また、複数台の Mac で表示させる事も考えられます。そんなとき、serf のお陰で、柔軟な運用ができそうだと期待しています。
Raspberry Pi だけでなく、Linux が稼働する(serf が動作する)端末であれば、どのようなものにも適用できると思います。手軽な応用先は、VM の IP アドレスを表示する事かな?と思っていますが、まだ試していません。
また思いつけば、いろいろ試そうと思います( ^ω^)
同じネットワーク内であれば、sudo apt-get install avahi-daemon
すると HOSTNAME.local で名前解決できると思います。
ありがとうございます!そいいう方法もあるんですね。