AWS EC2 での bash プロンプトに、設定したEC2 Instance Nameを表示する

「ログインしたEC2 instance のプロンプトには Private IP address ベースのホスト名が表示されているだけで、どのマシンにログインしたのかパット見では分からない。なんとかならない?」という相談を受けたので、いろいろと考えてみた。

結論からすれば、EC2 Instance を立ち上げる時にホスト名をつけたり、Tagをつけたりするので、それを bash のプロンプトに表示させてしまえばOKだろう。
ということで、

  • EC2 Instance のIAMロールで、AmazonEC2ReadOnlyAccess を割り当てる。
  • /etc/profile.d/instance_name.sh に、下記のようなものを置いてみた。
#!/bin/bash

# get availability zone name
z="$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone | sed -e 's/.$//g')"

# get instance-id myself
instance_id="$(curl -s http://169.254.169.254/latest/meta-data/instance-id/)"

# get Name from tags
aws_tag_name="$(aws --region $z ec2 describe-instances --instance-ids $instance_id --output text --query 'Reservations[].Instances[].Tags[?Key==`Name`].[Value]')"

PS1="[u@h ${aws_tag_name} W]n$ "

元ネタ: EC2インスタンスにtagで付けた名前をサーバー内から取得する

Intel Edison Kit for Arduino

Intel Edison Kit for Arduino

だいぶ前に Intel Edison Kit for Arduino を貰ったので試しに入れてみたのだが、中のソフトウェアを更新するために opkg upgrade をしただけで disk full になった。開発環境として使わせるためにコンパイラなどが入っているのだが、構築済みシステムで update すらできないって、どういうことでしょうかね。。(汗)

Ubuntu 16 + nginx で HTTP2

このBlogを置いてある masaru.org のWebサーバを HTTP2 に対応させようと頑張っており、昨日対応完了したのでメモっておきます。

必要なものはこのとおりでした。

  • Ubuntu 16 Server
  • nginx-1.10
  • openssl-1.0.2g

各所のドキュメントを読んでいたところ nginx-1.9.5 以降ならばHTTP2に対応しているとのことで、 nginxの本家にある nginx-1.10 の deb パッケージをインストールしてみたところ、Safari や iOSの Google Chrome では HTTP2 で通信するものの、MacやWindowsのGoogle ChromeではHTTP/1.1 のままで、困っておりました。
昨日見た記事では、Google ChromeでHTTP2 対応させるには、Webサーバ側でopenssl-1.0.2 以降を利用する必要があるとのことだったので、サーバで使っている Ubuntu を 16 にアップグレードすることを決意。

下記のようなパッケージ構成にしたところ、無事に Google Chrome でも HTTP2が利用できるようになりました。

$ dpkg -l 'libssl*' 'nginx*'
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name           Version      Architecture Description
+++-==============-============-============-=================================
un  libssl                       (no description available)
ii  libssl0.9.8:i3 0.9.8o-7ubun i386         SSL shared libraries
un  libssl096-dev                (no description available)
ii  libssl1.0.0:i3 1.0.2g-1ubun i386         Secure Sockets Layer toolkit - sh
rc  nginx          1.10.1-1~tru i386         high performance web server
ii  nginx-common   1.10.0-0ubun all          small, powerful, scalable web/pro
un  nginx-core                   (no description available)
un  nginx-doc                    (no description available)
un  nginx-extras                 (no description available)
ii  nginx-full     1.10.0-0ubun i386         nginx web/proxy server (standard
un  nginx-light                  (no description available)

Vyatta/Vyos のコマンドインターフェース

久しぶりにLinuxのネタでも書いてみようかと。

Linux Box を Router として使うのに便利な Vyos (旧 vyatta) で、ちょいと自分たちが調べたい統計を取ろうと思い、いろいろと調べていました。

Vyos の場合、Console や SSH などでログインをすると、LinuxのBashの代わりに /bin/vbash というBashっぽいものが動き、ネットワーク機器に有りがちなコマンドインターフェースが提供されています。 このコマンドインターフェースではルータとしての機能設定や現在の状況を表示することができ、例えばshow dhcp server statistics といったコマンドを実行すれば、DHCPサーバのIPアドレス貸出数 (number of leased) が表示されます。

ちょうど監視項目として、vbash 経由で取得できる情報を使って、IPアドレス貸出数を zabbix 経由で取得したかったので、調べてみたのです。

まず show コマンドの実装がどうなっているのか調べてみたところ、こんな感じでした。

 $ type show
show is aliased to `_vyatta_op_run show'

$ type _vyatta_op_run | head -5
_vyatta_op_run is a function
_vyatta_op_run ()
{
    local -i estat;
    local tpath=$vyatta_op_templates;

show コマンドはBashのマクロっぽいもので実装されていますね。

次に show dhcp server statistics がどうなっているのか調べるために、Bashの実行オプションを set -x と変更して、評価されるコマンドを表示して調べてみました。

vyatta@vyatta:~$ set -x
+ return 0
++ history -a
vyatta@vyatta:~$ show dhcp server statistics
.... 中略 ....

+ eval shopt -s 'extglob;shopt' -u 'nullglob;'
++ shopt -s extglob
++ shopt -u nullglob
+ [[ -t 1 ]]
+ eval '${vyatta_bindir}/sudo-users/vyatta-show-dhcp-server.pl --show-stats'
++ /opt/vyatta/bin/sudo-users/vyatta-show-dhcp-server.pl --show-stats
+ return 0

pool                                    pool size   # leased    # avail
----                                    ---------   --------    -------
hogehage                                200         4           196

++ history -a

この部分からわかったのが、 show dhcp server statisticsというコマンドを実行すると

/opt/vyatta/bin/sudo-users/vyatta-show-dhcp-server.pl --show-stats

が最後に実行されるということでした。

こんな感じにして、Vyatta/Vyos のコマンドから取得できる値をBashスクリプトにして、Zabbix agent から読み出すようにしてみます。

!/bin/bash
target="$1"
column="$2"

case "$column" in
"poolsize"|1)	col=2;;
"leased"|2)	col=3;;
"avail"|3)	col=4;;
*)
	echo "$0  (poolsize|1|leased|2|avail|3)"
	exit 255
	;;
esac

/opt/vyatta/bin/sudo-users/vyatta-show-dhcp-server.pl --show-stat pool="$target"|grep "^$target" | awk "{print $${col} }"

あとは /etc/zabbix/zabbix_agentd.d/userparameter_dhcpd.conf とかいうファイルに、下記内容を書いて sudo service zabbix-agent restart すればOKです。

UserParameter=service.dhcpd.leased[*],/etc/zabbix/dhcp_server_stat.sh $1 leased

引数を取るようになっているので、Zabbix のアイテム設定時のKeyのパラメータに pool名を引数として設定します。

service.dhcpd.leased[hagehoge]

あとはグラフも設定して完了っと。

pwgen – Password の自動生成

いつも新しいパスワードを作成するときにコマンド名を忘れてしまうPassword生成器。 ほぼ個人的備忘録として書いておきます。

コマンド名は pwgen です。 http://pwgen.sourceforge.net/

Debian, Unbuntu では

sudo apt-get install pwgen

Mac OS X の brew では

brew install pwgen

でインストールできます。

実行例

# 8文字のパスワードを4つ表示
$ pwgen 8 4
eiCohch3 QuuVoh4o choH2goo Phohxaa5

# 記号(symbol)入り 10文字のパスワードを2つ表示
$ pwgen -y 10 2
se7Arobe#i shie4uo`Wu

使って思ったけど、JavaScript で出来た Web browser 版が有るとイイかも。
っと思って調べてみたら、 http://fm4dd.com/security/pwgen.htm というものがありました。

Raspberry Piのケース

だいぶ前に購入して放置気味だったRaspberry Pi B+ ですが、チョットは工作とかすれば弄る気が起きるだろうと思い、先ずはケースを作ってみた。

デンタルフロスの箱にRaspberry Pi

使ったものは、その辺の薬局で買ってきたデンタルフロスの箱。コネクタ類の場所に電ドリやカッターナイフで適度に穴あけて、蓋閉めて完了。

ちょいとルータでも作ろうかなと。

漢字に中国語のPinyin、広東語の発音、Cangjie strokeを表示するWebサイト

だいぶ前からですが、漢字に中国語の拼音(ピンイン)、広東語の発音、繁体字の漢字入力に使うCangjie のキーシーケンスを表示するWebサイトを作りました。 中国語の学習に参考になればと思いまして。

https://masaru.org/ctp/

あとは、簡体字入力に使う五筆のキーシーケンスも表示できると良いのですが、元データを近々探してきます。

このサイトで使っているデータは Unicode の UniHan DB を用いて、後ろ側では TokyoCabinet を使って組んでいます。 速度的にはソコソコ出ているかと思います。

ソースコードは https://github.com/masaruyokoi/ChineseCharConverter に置いています。

広東語の拼音を探して… Unicode に辿り着く

広東語を勉強するためのツールの揃いがワルすぎるので、ちょっと自分で作ることに。

まずは、広東語の発音をコンピュータで調べる方法として http://www.kawa.net/works/ajax/romanize/chinese.html を使っていたのですが、自分でももうチョット工夫してみたいなと思っていたところでした。

イロイロと調べたところ、こんな感じでした。

さらに調査を進めたところ、Unicode の Unihan Database に、Unicodeの各文字と発音の対応が載っていることを発見。 Unihan とは Unicode Han(漢) の略だそうです。 さらっと見た漢字では、これらの内容が収録されています。

  • 各漢字の中国語普通話(Mandarin)、広東語、日本語、ベトナム語、韓国語での発音が記されています。 いわゆる CJKVってやつですね。
  • 簡体字・繁体字・日本語などの他言語の文字で、書き方は異なるが同じ意味の文字への対応もまとまっています。
  • Cangjie での入力方法、辞書などでの収録位置など。 あれ、五筆の入力方法が書いていないな。。

詳しくは、Unicode Standard Annex #38 Unicode Han Databaseを御覧ください。

ってことで、ちょいとこの Unihan を parse して表示するプログラムを書いてみました。 実行結果はこんな感じ。

Unihanをホジホジ

あとは、これを kvs などに入れてやったりすれば、先に上げたWebサイトみたいなものは作れそうですね。

Muninの設定についてまとめてみる。

久しぶりに Munin の設定についてまとめてみる。 前回書いたのが4年以上前みたいなので。 最近の事情とか含めたりと。

Munin の仕組み

Muninは各マシンの状態を数値で取得して、グラフを書いて状態の可視化をするツールです。 Muninには munin-node という監視される側 (agent) と、munin サーバと呼ばれる数値を収集して記録しグラフ作成を行う2つのパートに分かれます。

  • エージェントである munin-node
  • 情報収集を行う munin server
    • munin-node に接続し情報を収集する munin-update
    • 可視化するためのHTMLを作成する munin-html
    • 可視化するためのグラフ画像を作成する munin-grapth, munin-cgi-grapth, munin-fastcgi-graph
    • 上記3つを駆動する munin-cron

munin-node のインストールや設定

昔はFedoraやEPELからパッケージを持ってきて云々とかしていたのですが、最近はそのようなことも必要なくなり、おおよその Linux ディストーションに添付されるようになりました。 インストールは yum や apt-get で行えばよいかと思います。

sudo yum install munin-node
sudo apt-get install munin-node

設定は /etc/munin/node.d ディレクトリがある場合には、この中に node.conf などのファイルを作って、そこに設定を書いていくと良いでしょう。 無い場合には /etc/munin/munin-node.conf に書いていきましょう。

おおよそ必要な設定項目は下記のようになります。

# Listen するインターフェースを指定
host *

# munin-server のアドレスを指定: 正規表現
allow ^127.0.0.1$

# CIDR での指定
cidr_allow 192.0.2.0/24
cidr_deny  192.0.2.42/32

設定が終わったら、localhost や munin server から telnet などで接続できるか確認します。

telnet localhost 4949

ここで、下記のようなコマンドを送ってみましょう

  • list : 監視できるプラグインの一覧です
  • fetch df : fetch でプラグインごとの値が取得できます。 この場合は df (disk_free) の値を取得しています。
  • quit : 接続を終了します。

munin serverの設定

munin server は munin-node エージェントから各マシンの値を取得して、これを記録しHTMLやPNGのグラフとして可視化します。 また各プラグインの閾値などを元に Critical, Warning の表示をすることも出来ます。

設定ファイルは /etc/munin/munin-conf.d (Debian) や /etc/munin/conf.d (CentOS, Amazon Linux) などに配置するとよいでしょう。

まずは監視対象のホストの一覧を書きましょう。例えば /etc/munin/munin-conf.dhosts.conf といったファイルを作って、内容は下記のようにします。

[host.masaru.org]
        address 10.0.0.1
        use_node_name   yes

監視対象のホストの分だけ、上記のような内容を書いていきます。

Web Server 経由で見られるように設定

Munin が作成するHTMLを Web Server 経由で見られるように、下記内容を適切なVirtualHost内に記述します。

Alias /munin /var/cache/munin/www
<Directory /var/cache/munin/www>
#Order allow,deny
#Allow from localhost 127.0.0.0/8 ::1
Options None

AuthUserFile /etc/munin/munin-htpasswd
AuthName "Munin"
AuthType Basic
require valid-user

#<IfModule mod_expires.c>
# ExpiresActive On
# ExpiresDefault M310
#</IfModule>

</Directory>

Debian の場合は /var/cache/munin/www の中に munin-html や munin-graph などが作り出す HTML, PNG を保存するようになっているので、このディレクトリへの Alias を設定しておきます。 CentOS などでは /var/www/html/munin に作っていました。

あとは apache をリスタートするなりして、表示されるか確認してください。

うまくいかない場合は、これらのログファイルを参考にヒントを探してください。

  • /var/log/apache2/error.log
  • /var/log/munin/munin-update.log
  • munin-node の /var/log/munin/munin-node.log
  • /var/log/munin/munin-html.log
  • /var/log/munin/munin-grapth.log

Tips

Munin の環境を作っていくと、問題に遭遇したり、さらに詳しい監視を行いたくなるでしょう。
それらの対処法をまとめておきます。

  • 監視対象が多くてグラフのPNGファイル作成に時間がかかる
  • munin-node の監視を増やす
    • Apache HTTPD 特有の監視
    • MySQL の監視

監視対象が多くなり、グラフのPNGファイル作成に時間が掛かる

標準的なMuninパッケージの設定の場合、Munin Server は5分に1回 cron で munin-cron が実行され、 munin-node から値を取得記録し、munin-html, munin-grapth を実行するようになっています。 監視対象のホストはプラグイン数が増えると、特に munin-grapth の実行回数が増えて、1回あたりの処理時間が長くなってしまいます。

対策としては、下記の2つが有力です。

  • munin-node のプラグインを減らす
  • グラフ作成を CGI や FastCGIに切替える

munin-node のプラグインを減らすのは手っ取り早いです。 /etc/munin/plugins ディレクトリの中に munin-node が利用するプラグインがシンボリックリンクで登録されています。 不要でしたら削除してから sudo service munin-node restart してください。

もう一つの方法は、グラフのPNG作成をCGIやFastCGIで実行する方法です。 MuninのグラフPNGは常に全てが見られるわけではないので、Webブラウザで見に来た時に On-demand で作成する方法です。 若干手間がかかりますが、結構現実的な対応法です。

まずは /etc/munin/munin-conf.d/cgi.conf などのファイルを作って、下記の内容を書きます。

# グラフ作成戦略を cgi にする
graph_strategy cgi
# 同時に動かすグラフ作成のスレッド数
munin_cgi_graph_jobs 6
# グラフを作成するCGIへのパス。HTML中に埋め込まれます。
cgiurl_graph /cgi-bin/munin-cgi-graph

この設定を行った後の munin-cron は、HTML作成時にグラフPNGのファイルを作成せず、上記の CGI パスをHTML中に埋め込みます。

そして、一部ディレクトリをCGIから書き出す具合になるので、Debianの場合は下記コマンドでファイル・ディレクトリのグループIDを変更し、 group writable にします。

sudo chgrp -R www-data /var/cache/munin/www /var/log/munin
sudo chmod g+w /var/cache/munin/www /var/log/munin

また、log rotate 時の所有者の設定も必要なので、/etc/cron.d/munin に下記のような設定も行います。

/var/log/munin/munin-graph.log {
        daily
        missingok
        rotate 7
        compress
        notifempty
        create 660 munin www-data
}

あとは、munin-cgi-graph が動作するように、 Apache の場合でしたら目的の VirtualHost 内に cgi-bin の設定をします。

ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/

あとは apache をリスタートするなりして、確認してください。 うまくいかないようでしたら、これらのログファイルを参考にヒントを探してください。

  • /var/log/apache2/error.log
  • /var/log/munin/munin-grapth.log

Apache HTTPD 特有の監視

Apache HTTPD には mod_status という機能があり、実行しているプロセス数や転送量などを取得できるようになっています。 これの結果を munin から取得できます。

まずは mod_status の設定をします。 Debian でしたら下記コマンドで mod_status を活性化できます。

sudo a2enmod status

あとは sudo service apache2 restart などを実行して、設定を反映してください。 そして、curl http://localhost/server-status などを実行して、localhost の Apache から status が取得できるか確認します。

munin-node へのプラグインの登録は、/etc/munin/plugins/ にシンボリックリンクを作って munin-node をリスタートするだけです。

cd /etc/munin/plugins/
for i in  /usr/share/munin/plugins/apache_* ; do
 sudo ln -vs $i
done
sudo service munin-node restart

MySQL の状態監視

Munin には MySQL Server に接続して、各種統計情報を収集するプラグインがあります。 これの設定方法を Debian/Ubuntu を例に紹介します。

PostgreSQLも同様にDB接続や認証周りを設定すれば利用できるはずです。

まずは MySQL Server に接続するためのID, Password の設定を拾ってきます。 Debianの場合、/etc/mysql/debian.cnf に下記のような設定があるかと思います。 Debパッケージをインストールするときに、各マシンの MySQLサーバに管理用のID, Passwordを設定しているようです。

user     = debian-sys-maint
password = XXXXXXXXXXXXXXXX

これの password の内容をコピーしておき、 /etc/munin/plugin-conf.d/munin の mysqlセクションに記述します。 記述後の内容は下記のようになります。

[mysql*]
user root
env.mysqlopts --defaults-file=/etc/mysql/debian.cnf
env.mysqluser debian-sys-maint
env.mysqlpassword XXXXXXXXXXXXXXXX
env.mysqlconnection DBI:mysql:mysql;mysql_read_default_file=/etc/mysql/debian.cnf

そして、/usr/share/munin/plugins/mysql_ の suggest 機能を使うと、監視できるか確認が出来ます。 私の手元の MySQLサーバで実行したら、下記のようになりました。

$ sudo /usr/share/munin/plugins/mysql_ suggest
bin_relay_log
commands
connections
files_tables
innodb_bpool
innodb_bpool_act
innodb_insert_buf
innodb_io
innodb_io_pend
innodb_log
innodb_rows
innodb_semaphores
innodb_tnx
myisam_indexes
network_traffic
qcache
qcache_mem
replication
select_types
slow
sorts
table_locks
tmp_tables

これらの監視が出来るということですので、root ユーザで下記のようなコマンドを使って一気にプラグイン登録します。

for i in $(/usr/share/munin/plugins/mysql_ suggest) ; do
  ln -vs /usr/share/munin/plugins/mysql_ /etc/munin/plugins/mysql_$i
done

終わったら、sudo service munin-node restart を実行してプラグイン一覧の更新をしてください。

Bittorrent Sync で PC, Mac, Linux, Android 間のファイル同期を

Windows Live Sync 亡き後の、ファイルサーバ不要のP2P型ファイル同期サービスを探していたのですが、 Bittorrent Sync が現実的に使い物になるっぽいので、コレに乗り換えました。

http://labs.bittorrent.com/experiments/sync

特徴としてはこんな感じです。

  • 現状では利用者ごとにアカウントを作るようなことは不要。将来はわからないけど。
  • 対応機種は Windows, Mac, Linux, Android, iOS (iPhoneなど) だそうです。
  • 共有する場所を指定・識別するのは「共有シークレットキー」と呼ばれるハッシュ
    • ちょっと考えればわかるけど、この共有シークレットキーが他人に知られれば、ファイル漏洩します。
    • 共有シークレットキーには「読み書き可能」(read/write) と「読み取り専用」(read) の2種類
  • uPnPでNATのforward 設定もするみたいなので、インターネット越しに同期できるみたいです。

使い方としては、Mac, Linux, PC などで同期するディレクトリを指定して、共有シークレットキーを同期先にコピーする具合です。 Android/iPhoneはカメラでQRコードを読み取るようにしても設定できます。

同期するフォルダの設定

手元では Mac と QNAP ファイルサーバ (Linux)、Android, iPhone で設定しました。 各実行環境での特徴はこんな感じ

  • iPhoneでは他のアプリが使っている特定ディレクトリを指定するみたいなことが出来ません。iPhoneからアップロードするものでは、カメラで撮影したものぐらいで、カメラアップロードぐらいが実用的かと思います。
  • AndroidやiPhoneでは、Mac, Linux に保存されているファイルを自動的にダウンロードする設定にはなっておらず、必要なときに選択してダウンロードするようになっています。