インフィニットループ 技術ブログ

2016年12月27日 (火)

著者 : mizuno_as

クリスタルシグナルPiのボタンを拡張する新機能を使う方法

こんにちは、mizuno_asです。
今日はクリスタルシグナルPiに実装中の新機能のご紹介です。
なお、クリスタルシグナルPiとは? という方は、まず以下のリンクをご覧ください。


現在クリスタルシグナルPiのミドルウェアに、

  • アラートが発生した時、ボタン押した時、ボタンを2秒以上長押しした時それぞれに、任意のスクリプトを実行する。
  • LEDの輝度を40%から100%の間で調整する。

という機能を試験的に実装中です。

【注意】この機能は正式リリース版ではなく、あくまでテスト目的のベータ版となります。今後、互換性を損う仕様変更が行われる可能性もあることをご了承ください。

従来、ボタンにはアラートをAck(消灯)する機能がハードコーディングされていましたが、今回のバージョンアップによりこの機能は「Ackを送信するスクリプトをボタンにアサインする」という実装に変更されました。デフォルトでこの設定がなされているため、従来とボタンの挙動に変化はありません。もちろん、アサインするスクリプトはユーザーが自由に変更することができます。
詳しくはマニュアルを参照してください。

以下のコマンドを実行することで、開発中のバージョンにアップデートできます。開発中ブランチからインストーラーをダウンロードし直した上、-rオプションでブランチ名を指定してアップデートします。

$ curl -O https://raw.githubusercontent.com/infiniteloop-inc/crystal-signal/ButtonAndAlarmScripts/install.sh
$ sudo bash install.sh -r ButtonAndAlarmScripts update

アラート受信時にスクリプトを実行する例

それではこの新機能を利用して

  • アラートが発生したらチームのSlackに通知する
  • 誰かが対応を開始したらAckメッセージをSlackに通知する

という機能を実装してみましょう。基本的にはゴミ出しBotの時と同じ実装になります。
まずはSlackにチャンネルを開設して、Botを召喚します。投稿用のWebhook URLを控えておきましょう。

インシデント専門チャンネルを作成。

Incomming Webhookさんをチャンネルに投入。

スクリプトは/var/lib/crystal-signal/scriptsに配置する仕様です。以下のスクリプトをslack-alart.shとして実装しました。実行権限をつけておくのを忘れないでください。

#!/bin/sh
URL=https://hooks.slack.com/services/なんやかんや
INFO=$(curl -s 'http://localhost/ctrl/?json=1' | jq -r '.info')
if [ -n "$INFO" ]; then
  MSG="$INFO で"
fi
MSG="${MSG}障害が発生しました!"
curl -s -X POST --data-urlencode "payload={\"text\": \"${MSG}\"}" $URL >/dev/null

ご存知の通りクリスタルシグナルPiのAPIには、任意の付加情報を渡せるinfoというパラメーターが用意されています。今回はここに、アラートが発生したサーバーのFQDNを入れることにしました ((もちろんこれはZabbix等、アラートを上げる監視システム側の仕事です。)) 。スクリプト内では自分自身に対して現在の状態を問い合わせ、レスポンスのJSONからinfoを取り出し、メッセージに埋め込んでいます。お好みでスクリプトにaplayコマンドを組み込んで、アラート音声を再生するのも便利です。
スクリプトが完成したら、Web UI画面をブラウザで開きましょう。まずは新しく追加されたSettingsタブを開いて

画面上部のSettingsをポチっと。

General Settingsの「アラートが発生した後に実行」のプルダウンで、先ほど実装したslack-alart.shを選択してください。

実行するスクリプトを選択。

この状態でアラートを発生させてみましょう。

ででーん!

ボタンにスクリプトをアサインする例

続いてはAckボタン機能の実装です。アラート発生時にボタンを押下したら、アラートを消灯しつつ対応開始をSlackに報告することにしましょう。デフォルトで用意されているAck.shをちょっと改造して、以下のslack-ack.shを実装しました。

#!/bin/bash
URL=https://hooks.slack.com/services/なんやかんや
/usr/bin/curl -s "http://localhost/ctrl/?ack=1" > /dev/null
MSG="$(hostname)が対応します!"
curl -s -X POST --data-urlencode "payload={\"text\": \"${MSG}\"}" $URL >/dev/null

自分の名前はhostnameコマンドで取得しています。チーム全員が机上の置いて運用するような場合は、ホスト名を利用者名にしておくというルールにするだろうという想定です ((avahiを使う上でも、このルールは合理的だと思います。)) 。
これもSettings画面を開いて、ボタンにアサインしておきましょう。

アラート発生中と待機中でボタンの挙動を変えられるところが芸コマです。

アラート発生! ぽちっとな。

超クール!

もうチーム全員に持たせたいですよね! 欲しくなりましたか? 欲しくなりましたよね?
第二ロットの申し込みは現在終了してしまいましたが、登録フォームからメールアドレスを登録して頂くと、次回申し込み開始時にお知らせメールが届きますよ。ご利用ください!

さらなる応用として、ボタン長押しには他の人にお願いするスクリプトをアサインしてみました。このスクリプトを「アラート受信時」に設定すると、全自動丸投げシステムの完成です。よい子は真似しないでね。

ブログ記事検索

このブログについて

このブログは、札幌市・仙台市の「株式会社インフィニットループ」が運営する技術ブログです。 お仕事で使えるITネタを社員たちが発信します!