詩と創作・思索のひろば

ドキドキギュンギュンダイアリーです!!!

Fork me on GitHub

Mackerel + peco + zsh でコマンドラインにホスト名を補完する

複数のサーバが関わっている環境では、ホストに人間が分かる名前を関連付けなければ運用がスケールしなくなるものです。その名前はホスト名だったり、ロールやタグのようなものだったりすると思いますが、仮にホスト名を利用するなら、DNS を用いて名前とホスト(の IP アドレス)の対応をつけるようなこともできるでしょう。DNS が利用できない場合は、/etc/hosts に書くというようなのもありですね。

しかしホスト名を直接利用した運用というのは意外と難儀なところがあって、とくに自分のように普段サーバを扱った作業をあまりしないアプリケーションエンジニアなどは、「前に接続したことあるあのホストは何だっけ……」といううろ覚え状態に弱い。名前の一部は覚えているわけなので、シェルの履歴を検索すればなんとかなるのですが、一度も接続したことがなければ目当てのホストを探し出すことはできません(この、接続したことがあるかどうかに確信が持てないのもストレス)。

Mackerel と mkr

さて、Mackerel ははてなが提供するサーバ管理・監視サービスで、私もふだん利用しているものなので、これを使うことを考えます。Mackerel ではサーバはホスト名だけでなくサービス/ロールにひも付きますから、たとえホスト名に意味のある名前をつけない運用であっても、サービスとロール("app" や "db" など)をたどることで目当てのサーバを見つけることができます。この側面を利用すると、とても人間にやさしい。ここで mkr というツールを用いて、関心のあるホストを簡単に見つけられるようにする方法を実現します。

mkr は Mackerel が提供する API の公式クライアントです。Go で実装されていて、go get またはバイナリのダウンロードで利用できます。

go get github.com/mackerelio/mkr

mkr では、

  • Mackerel へのホストの登録(mkr create
  • ホスト情報の更新(mkr update
  • メトリックの投稿(mkr throw
  • ホスト情報の一覧(mkr hosts

などの API がコマンドラインインターフェースで利用できます。基本的には MACKEREL_APIKEY 環境変数に Mackerel の API キーを設定して使いますが、標準的な構成で mackerel-agent を稼働させているホストで実行する場合にはその設定ファイルから API キーやホスト ID を再構成してくれるため、便利なことに追加の設定なしですぐ使えるようです(詳しくは README をご覧ください)。

ここではホスト情報の一覧(mkr hosts)を使うことになりますが、このコマンドには -f オプションが定義されていて、Go の text/template 形式で出力を加工できるようになっているので、これを利用します。

mkr + peco + zsh による実現

f:id:motemen:20150630233012g:plain

上のスクリーンキャストでは Mackerel に登録しているサーバをそのホスト名およびサービス/ロールとともに一覧し、peco であいまい検索を行って、選択したものをコマンドラインに補完する、ということをしています(というのを ^[o にマッピングしている)。コマンドラインには直接 IP アドレスを展開し、末尾にコメントとしてホスト名を記録しているので、シェルの履歴にもコンテキストが残りますね。

これは以下の zsh 関数とシェルスクリプトの組み合わせで実現しています。

complete-mackerel-host-ip

zsh 関数 complete-mackerel-host-ip がキモで、入力中の単語から Mackerel に登録しているホストのあいまい検索を行ない、入力中のバッファに展開します。環境変数を用いず第1引数に API キーを取るようにしているので、環境変数以外の場所でキーを管理しているような場合にもたぶん簡単に使えるはずです。ちなみにあまり用途はないかもしれませんが第2引数には API キーの名前を指定できて、 複数の Mackerel オーガニゼーションを並行して利用している場合にはこれでキャッシュを分離できるようになっています。

ここでは IP アドレス部分のマッチをおこなわないよう指定できる fzf を利用していますが、filter 変数を 'peco' に書き換えることで peco にもすぐ切り替えることができます。

https://gist.github.com/motemen/2b0656be9e2acf32b35d#file-complete-mackerel-host-ip-zsh

mkr-hosts-tsv

これはキャッシュしつつ Mackerel のホストを TSV で一覧するだけのシェルスクリプト。PATH の通るところに置いてください。ここで mkr hosts とその -f オプションを利用していいます。

https://gist.github.com/motemen/2b0656be9e2acf32b35d#file-mkr-hosts-tsv

参考資料

はてなで一緒に働きませんか?