カテゴリー : 2014年 9月

[Slack] Nagios からの通知を Channel に書き込む

Nagios からのアラート通知を Slack の Incoming WebHooks を利用して Channel へ書き込む設定をしました。

Slack には Nagios の Integration が用意されているので、普通はこれ使えば良さそうです。

しかし、今回は Lite プランに抑えたいという理由で、色々とインテグレーションを使ってると 5 external integrations の上限に引っかかってしまうのを避けるために Incoming WebHooks を使って自前で実装しました。Incoming WebHooks の Webhook URL を発行するのは上限ないみたいなので重宝しています。

早速、シェルスクリプトを書こうと思ったんですが、ググったら Gist にコード公開している人が居たので fork してちょっと書き換えて使うことにしました。

slack_nagios.sh – gist

下記が、gist に公開しているシェルスクリプトの内容です。

#!/bin/bash
 
# This script is used by Nagios to post alerts into a Slack channel
# using the Incoming WebHooks integration. Create the channel, botname
# and integration first and then add this notification script in your
# Nagios configuration.
#
# All variables that start with NAGIOS_ are provided by Nagios as 
# environment variables when an notification is generated.
# A list of the env variables is available here: 
#   http://nagios.sourceforge.net/docs/3_0/macrolist.html
#
# More info on Slack
# Website: https://slack.com/
# Twitter: @slackhq, @slackapi
#
# My info
# Website: bakorer.com
# Twitter: @bakorer
 
#Modify these variables for your environment
MY_NAGIOS_HOSTNAME="nagios.yourdomain.com"
MY_NAGIOS_STATUS_URL="http://${MY_NAGIOS_HOSTNAME}/nagios/cgi-bin/status.cgi?host=${NAGIOS_HOSTNAME}"
SLACK_HOSTNAME="yourslack.slack.com"
SLACK_TOKEN="xyxyxyourslackkey"
SLACK_CHANNEL="#alert"
SLACK_BOTNAME="Nagios"
 
 
#Set the message icon based on Nagios service state
if [ "$NAGIOS_SERVICESTATE" = "CRITICAL" ]
then
    ICON=":exclamation:"
    COLOR="danger"
elif [ "$NAGIOS_SERVICESTATE" = "WARNING" ]
then
    ICON=":warning:"
    COLOR="warning"
elif [ "$NAGIOS_SERVICESTATE" = "OK" ]
then
    ICON=":white_check_mark:"
    COLOR="good"
elif [ "$NAGIOS_SERVICESTATE" = "UNKNOWN" ]
then
    ICON=":question:"
    COLOR="#00FFFF"
else
    ICON=":white_medium_square:"
    COLOR="#FFFFFF"
fi
 
#Send message to Slack
curl -X POST --data "payload={\"channel\": \"${SLACK_CHANNEL}\", \"username\": \"${SLACK_BOTNAME}\", \"icon_url\": \"https://slack.com/img/services/nagios_48.png\", \"text\": \"${ICON} HOST: ${NAGIOS_HOSTNAME}   SERVICE: ${NAGIOS_SERVICEDISPLAYNAME}     MESSAGE: ${NAGIOS_SERVICEOUTPUT} <${MY_NAGIOS_STATUS_URL}|See Nagios>\"}" https://${SLACK_HOSTNAME}/services/hooks/incoming-webhook?token=${SLACK_TOKEN}

これを Nagios を動かしているサーバーの plugins 以下とかに設置して、実行できるようにします。

chmod +x /usr/lib64/nagios/plugins/slack_nagios.sh

そして、Nagios commands に slack_nagios.sh を実行する定義を追加します。

vim /etc/nagios/objects/commands.cfg
 
define command {
    command_name    notify-service-by-slack
    command_line    /usr/lib64/nagios/plugins/slack_nagios.sh
}

contacts にも Slack を追加します。

vim /etc/nagios/objects/contacts.cfg
 
define contact {
  contact_name slack
  use generic-contact
  service_notification_commands   notify-service-by-slack
  email   /dev/null
}

あとは Slack の #alert channel に通知したいサービスに登録してあげて、設定確認と reload すれば完了です。

service nginx configtest
service nagios reload

Nagios のアラートを Slack へテスト通知してみた結果は下記のような感じです。

slack-nagios

Slack はチャンネル毎にアプリで通知を受け取るか設定できるので、これで夜中に Nagios からアラートきても気付けて、即対応できて幸せですね!

IE11 で Twitter Bootstrap 2系のモーダルの挙動がおかしい

Twitter Bootstrap 2系の話です。良い子は3系を使いましょう。

IE11 で Twitter Bootstrap 2 系のモーダルの挙動がおかしい、他のブラウザでは大丈夫だけど IE11 だけダメ・・・

結果だけ書いておくと、バージョンを 2.0.4 から 2.3.2 (2系の最新版)へアップデートしたら直りました。

Bootstrap version 2.3.2

こういうバグを踏むと悲しいので、使っているライブラリはこまめにバージョンアップしておきたいですね。

Twitter Cards は申請しないと使えない

Twitter Cards は申請しないと使えないんですね。

Card Validator | Twitter Developers

OGP 設定したらすぐに反映される Facebook とは違うみたいなので、事前に忘れず申請するようにしましょう。


参考情報

Twitterカード | Twitter Developers

Twitter Cards利用申請 – Qiita

Twitter Cardsの申請をしてみたよというお話。 | okaoka.net

HipChat, Slack, Sqwiggle を常駐させるとメモリ不足で死ねる

社内のチャットツールを HipChat から Slack へ移行中というのと、リモートワークのトライアル期間ということで今日から Sqwiggle を導入していて3つのアプリ常駐させています。

Private group chat, video chat, instant messaging for teams – HipChat

Slack: Be less busy

Online Collaboration Software for Remote and Virtual Teams | Sqwiggle

MacBook Air(メモリ 8GB)だとメモリ不足でツライので、さっさと Slack へ移行してしまいたいです。(自分のためにもやります)

そして、メモリ 16GB 積んだ MacBook Air の登場を心よりお待ちしております。

[Heroku] CloudFlareを利用したルートドメインの設定方法

“Action Required: Legacy Routing End of Life” というメールを受信している方も多いと思いますが、DNS の Aレコードで Heroku のレガシーな IP アドレスを指定するルーティングの方法が廃止されました。

僕は、Heroku の独自ドメインの設定方法という記事で書いているようなレガシールーティングを使って、Heroku 上に bakorer.com という About me ページを運用していました。レガシールーティングが廃止されるということで、別の方法でルートドメインの設定をする必要がでてきました。

Heroku はドキュメントが手厚く、カスタムドメインを設定する方法は公式サイトに書いてあります。

Custom Domains | Heroku Dev Center

外部サービスを利用する方法がいくつか存在するのですが、今回はその中の1つである CloudFlare を使ってルートドメインを Heroku にホスティングしているアプリに割り当ててみました。

CNAME Flattening: RFC-compliant support for CNAME at the root – CloudFlare Support

CloudFlare に登録する

まず、CloudFlare のアカウントを作成して下さい。

Home | CloudFlare | The web performance & security company

CloudFlare にウェブサイトを追加する

まず、設定したいドメインを追加します。

1-add-a-website-CloudFlare

CloudFlare でDNSレコードを設定する

追加したドメインの現状のDNSレコードが一覧表示されます。ここで編集、削除、追加などできます。

既存のDNSレコードから bakorer.com 向けの a レコードを削除して、代わりに CNAME レコードに Heroku でホスティングしているアプリのサブドメイン bakorer-com.herokuapp.com を指定します。(一番上)

2-Configure-DNS-CloudFlare

CloudFlare のプラン選択

プラン選択です。SSL を使わなくていいなら、DNS の設定だけだと無料で使えるようなので、Free プランを選択します。無料バンザイ!

3-Choose-settings-CloudFlare

CloudFlare のプラン選択

最後にネームサーバーの更新が必要です。

4-Update-your-DNS-CloudFlare

切替前は、ムームードメインのDNSサーバーを利用していて dns01.muumuu-domain.com. dns02.muumuu-domain.com. を確認できます。

dig bakorer.com NS
 
; <<>> DiG 9.8.3-P1 <<>> bakorer.com NS
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 58368
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 2
 
;; QUESTION SECTION:
;bakorer.com.			IN	NS
 
;; ANSWER SECTION:
bakorer.com.		2317	IN	NS	dns01.muumuu-domain.com.
bakorer.com.		2317	IN	NS	dns02.muumuu-domain.com.
 
;; ADDITIONAL SECTION:
dns01.muumuu-domain.com. 284	IN	A	157.7.180.150
dns02.muumuu-domain.com. 1207	IN	A	182.48.37.179
 
;; Query time: 30 msec
;; SERVER: 192.168.0.1#53(192.168.0.1)
;; WHEN: Sat Sep 20 23:31:11 2014
;; MSG SIZE  rcvd: 163

それをムームードメインの管理画面から下記のように「GMOペパボ以外のネームサーバーを使用する」の項目から、lina.ns.cloudflare.com. と jerry.ns.cloudflare.com. を設定します。

ネームサーバ設定変更   ムームードメイン

設定後、dig コマンドでネームサーバーが切り替わっていることを確認します。

dig bakorer.com NS
 
; <<>> DiG 9.8.3-P1 <<>> bakorer.com NS
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 58368
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 2
 
;; QUESTION SECTION:
;bakorer.com.			IN	NS
 
;; ANSWER SECTION:
bakorer.com.		3600	IN	NS	lina.ns.cloudflare.com.
bakorer.com.		3600	IN	NS	jerry.ns.cloudflare.com.
 
;; ADDITIONAL SECTION:
lina.ns.cloudflare.com.	919	IN	A	173.245.58.187
jerry.ns.cloudflare.com. 3507	IN	A	173.245.59.182
 
;; Query time: 389 msec
;; SERVER: 192.168.0.1#53(192.168.0.1)
;; WHEN: Sun Sep 21 00:14:42 2014
;; MSG SIZE  rcvd: 114

最後に、CloudFlare のページからもネームサーバーが切り替わったことが確認できます。

5-my-websites-CloudFlare

上画像の状態から、Re-test をクリックして下記のように切り替わればネームサーバーの設定は完了です。

6-my-websites-CloudFlare

CloudFlare を使うことでカンタンに Heroku でルートドメインを設定することができました。CloudFlare は CDN の無料枠もあるようなので、今度はそちらの機能も活用していきたいと思います。


参考情報

CloudFlare使ってHerokuでルートドメイン使おう – PILOG

[Domain] ドメインのWhoisにおける登録情報の日本語対応表

ドメインの登録情報を確認するには whois codenote.net だけで済みますが、これが日本語であれこれ書かれているとよく分からない。

NTTコミュニケーションズ ドメイン登録サービス | Whoisにおける登録情報の公開について

NTTコミュニケーションズのサイトに英語と日本語の対応が書かれているので、基本的にここで照らし合わせながら確認すればよかったです。

whois とかドキュメントに記載させずに、自分でもコマンド叩いて確認してもらうのが正確でいいと思うんですけどね。

[Linux] dig コマンドでネームサーバーを確認する

特定のドメインのネームサーバー確認するには dig コマンドを使えばいいらしい。

dig codenote.net NS 
 
; <<>> DiG 9.8.3-P1 <<>> codenote.net NS
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 44299
;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 0
 
;; QUESTION SECTION:
;codenote.net.			IN	NS
 
;; ANSWER SECTION:
codenote.net.		17207	IN	NS	01.dnsv.jp.
codenote.net.		17207	IN	NS	02.dnsv.jp.
codenote.net.		17207	IN	NS	03.dnsv.jp.
codenote.net.		17207	IN	NS	04.dnsv.jp.
 
;; Query time: 2 msec
;; SERVER: 192.168.1.1#53(192.168.1.1)
;; WHEN: Thu Sep 18 12:03:49 2014
;; MSG SIZE  rcvd: 105

dig ドメイン名 NS で確認できて、ANSWER SECTION の部分 01.dnsv.jp. 〜 04.dnsv.jp. がネームサーバーです。


参考情報

Linuxコマンド集 – 【 dig 】 ドメイン情報をDNSサーバーから取得する:ITpro

@IT:DNS Tips:digコマンドとは

[MongoDB] 改行文字を含む field の値をGoogle スプレッドシートでインポートできる形式で出力する

MongoDB で改行文字を含む field の値を Google スプレッドシートでインポートできる形式で出力する方法をご紹介します。

MongoDB

区切り文字には , (カンマ)を使い、改行文字を含むフィールドを ” (ダブルクオーテーション) で囲みます。

下記の例だと、 detail フィールドが改行文字を含みます。

db.products.find( { detail : regExp } ).forEach(function(p){
  print(p._id.valueOf() + ',"' + p.detail + '"');
});

あとは、スクリプトを実行して、実行結果をファイルに出力して、

mongo --quiet mydb script.js > example.csv

Google スプレッドシートにて、「区切り文字:自動的に検出する」で問題なくインポートできるはずです。

google-spreadsheet-import

以上です。

[Android] Google Play へのアプリのリリース手順

Google Play へ Android アプリをリリースする手順についてメモ。

基本的には、クラスメソッドのブログを読む。

よく分かる!Android アプリのリリース手順のまとめ | アドカレ2013 : SP #20 | Developers.IO

例えば、社内で既に Android アプリをリリースしていた場合、keystore ファイルの内容を確認すれば必要な情報はだいたい埋まるはず。

[Android] keystore ファイルの内容を確認するコマンド

アプリのリリース前になって思い出したかのようにこういう情報を用意するのは精神衛生上よくないので、事前に余裕持って準備したいですね。

[Android] keytool コマンドの文字化けを解決する方法

keytool コマンドで Android アプリの署名に使う keystore ファイルの内容を確認したところ Mac のターミナルで派手に文字化けしてしまいました。

keytool -v -list -keystore my-app.keystore
 
?L?[?X?g?A?̃p?X???[?h????͂??Ă???????:  
 
?L?[?X?g?A?̃^?C?v: JKS
?L?[?X?g?A?̃v???o?C?_: SUN
 
?L?[?X?g?A?ɂ? 1 ?G???g?????܂܂?܂??B
 
?ʖ?: com.exapmle
?쐬??: 2012/12/10
?G???g???^?C?v: PrivateKeyEntry
?ؖ??A???̒???: 1
?ؖ???[1]:
???L??: O=bakorer.com, C=JP
???s??: O=bakorer.com, C=JP
?V???A???ԍ?: 12b3389e
?L?????Ԃ̊J?n??: Mon Nov 26 18:38:38 JST 2012 ?I????: Fri Nov 20 18:38:38 JST 2037
?ؖ????̃t?B???K?[?v?????g:
	 MD5:  17:74:53:02:57:DB:80:62:4A:A6:D9:5F:6B:8D:AC:F2
	 SHA1: 12:F5:85:20:58:C6:5E:45:FF:03:AB:74:8F:20:D9:89:86:D5:3F:25
	 ?????A???S???Y????: SHA1withRSA
	 ?o?[?W????: 3
 
 
*******************************************
*******************************************

JDK で利用する文字コードに UTF-8 を指定してあげればいいみたいです。

export _JAVA_OPTIONS='-Dfile.encoding=UTF-8'

keytool の出力結果が文字化けせずに表示されました。

keytool -v -list -keystore  my-app.keystore
 
キーストアのパスワードを入力してください:  
 
キーストアのタイプ: JKS
キーストアのプロバイダ: SUN
 
キーストアには 1 エントリが含まれます。
 
別名: com.my-app
作成日: 2012/12/10
エントリタイプ: PrivateKeyEntry
証明連鎖の長さ: 1
証明書[1]:
所有者: O=bakorer.com, C=JP
発行者: O=bakorer.com, C=JP
シリアル番号: 12b3389e
有効期間の開始日: Mon Nov 26 18:38:38 JST 2012 終了日: Fri Nov 20 18:38:38 JST 2037
証明書のフィンガープリント:
	 MD5:  17:74:53:02:57:DB:80:62:4A:A6:D9:5F:6B:8D:AC:F2
	 SHA1: 12:F5:85:20:58:C6:5E:45:FF:03:AB:74:8F:20:D9:89:86:D5:3F:25
	 署名アルゴリズム名: SHA1withRSA
	 バージョン: 3
 
 
*******************************************
*******************************************

参考情報

Macでkeytoolコマンドが文字化けしたのでメモ – Androidはワンツーパンチ 三歩進んで二歩下がる