設定ファイル分割や、コマンド補完が使える拡張sshコマンドを公開しました。

最近「旧世代のAWSインスタンスから新世代への移行のタイプ別おすすめ一覧」にも書いたようにAWSインスタンスの整理をしています。
シロクは、創業時からAWSをそれなりにヘビーに使っていて、気が付けば80インスタンスくらいを管理している状態になっていました。

ホストが増えるとsshの設定がめちゃくちゃになる

そういうわけで大量のホストの接続設定を記述しているために、sshの設定ファイルは、大混乱をきたしています。
EC2のインスタンスを立てなおしたりIPが変化したりすると、状況は更に悪化し、開発メンバーの.ssh/configを正確に同期するのは困難を極めます。設定ファイルをgitで管理するという手があるのですが、全員の.ssh/configは必ずしも完全に同じではなく、個々人の独特な設定もあるので、共通管理することも難しいです。
ec2sshというEC2インスタンスへの接続設定を自動生成するツールもあるので、こういうツールを使うと管理はずいぶん楽になります。しかし、そもそもは「大量のHost設定を1枚の設定ファイルにまとめる」というのが無理な話かな、という気がします。

複数の設定ファイル対応の拡張sshコマンドを作りました。

そこで、設定ファイルを分割可能な、sshコマンドの拡張版として、sshx(ssh eXtended)というコマンドを作りました。
スクリーンショット 2014-03-09 18.06.26
sshx | RubyGems.org | your community gem host
RubyGemsにホスティングしているので、インストールは簡単です。

gem install sshx

実行も簡単です。通常のsshのラッパーとなっているので、同じ構文でコマンド実行ができます。

sshx hostname

初回のみ、プレーンsshからの移行処理が実行されます。

複数設定ファイルの使い方

sshxの初期化が完了すると、ホームディレクトリ下に.sshxというディレクトリが作成され、旧来の.ssh/configがssh_configという名前でコピーされます。また、sshxの設定ファイルであるconfigというファイルも生成されます。

$ ls ~/.sshx/
config		ssh_config

このディレクトリ下に追加されたファイルは全てSSHのホスト設定とみなされます。これによって、プロジェクトごとにsshの設定ファイルを分割することができます。
たとえばプロジェクトごとにsshの設定をgitで管理して、この設定ディレクトリ下にシンボリックリンクを貼るなどすると、プロジェクトごとの設定の管理が簡単にできます。

ln -s /var/repos/blog.git/sshx_config ~/.sshx/blog

ちなみに、今まで使っていた~/.ssh/configは、sshxが自動で更新をするため、これ以降は操作しないようにします。

設定ファイル.sshx/configの書き方

sshxの設定ファイルは単純なキーと値の設定になっています。

NamespaceSeparator -
EnableAlias true
SshPath /usr/bin/ssh
キー 意味
NamespaceSeparator ネームスペースの区切り文字
EnableAlias sshをsshxのエイリアスとして設定するか
SshPath プレーンsshへのパス

補足しておくと、EnableAliasはsshに対してsshxのエイリアスを貼ることを意味します。

$ ssh blog.prd.web
# sshx blog.prd.web として振る舞う

これによって、設定ファイルを書く時以外は、sshxを使っていることを忘れて使うことができます。

おまけ機能1. コマンド補完

sshxは最初は設定ファイルを分割することを目的として作成しましたが、おまけ的な機能をいくつか加えています。
一つ目がHost名のコマンド入力の補完機能です。

$ sshx blog.p
# ここで[TAB]を打つと
$ sshx blog.prd.web
# ホスト名が補完されます。

管理するホストが増えると、必然的にHost名が長くなるので、「補完できたら便利だなあ」ということで加えました。

おまけ機能2. ネームスペース

もうひとつ、ホストが増えてHost名が長くなるの問題の対処として、設定ファイルにネームスペースが使えるようになっています。

Namespace blog
Host prd.web
  HostName blog.katty.in
  Port 22
  User katty0324
  IdentityFile ~/.ssh/id_rsa

このように設定ファイルの途中にNamespaceの設定を加えると、以降のHost名にプレフィックスとしてネームスペースが加えられます。
この場合、Hostにはprd.webと書いていますが、Namespaceがblogのため、次のようにして接続することができます。

sshx blog.prd.web

この機能は、どうも中途半端なので、ホスト設定に継承関係をもたせたり、もっと便利な構文が使えるようにしたいと思っています。

おまけ機能3. tmuxでの複数ホストの同時操作

最後のおまけ的な機能として、複数ホストへ一気に接続することができます。tmuxが必要なので、インストールしていない場合は、事前にインストールする必要があります。
複数のサーバに同じコマンドを送れたりしてとても便利なtmuxのインストール
使い方は単純で、ホスト名の指定をカンマ区切りにします。

sshx blog.prd.web1,blog.prd.web2,blog.prd.web3

それぞれのホストへの接続を複数のペインに分割して行います。入力は同期状態になるので、全てのサーバに一気にコマンドを送信できます。
スクリーンショット 2014-03-10 0.20.41
用途としては、WEBサーバなど同一構成で並列されているサーバに対して、一気に接続してtopコマンドなどで状況を監視するなどができます。障害発生時などに、初動の大雑把な状況把握が高速におこなえたりして便利です。
これは「もっと簡単に!tmuxで複数のサーバにSSH接続して同じコマンドを一気に送る」に書いたのと同じようなプログラムを取り込みました。
この機能は、ホスト名にワイルドカード指定できるようにして、もっと簡単に接続できるようにしたいという願望があります。

オープンソースとして公開しています。

GitHubでMITライセンスとして公開しています。
スクリーンショット 2014-03-09 18.21.06
katty0324/sshx
「ツール作るならgemに公開したいな」ということで無理してRubyで書いているため、中身はあまり綺麗でないです。Rubyのお作法が分かりません。
gemの作り方については、以前自分で勉強しながら書いていた「RubyGemsにホスティングする第一歩!最小構成を知る。」が役に立ちました。

おわりに

まだコンセプト程度の機能しかありませんが、ぜひご利用ください!
公開してしまいましたが、ちょっとした弾みで動かなくなる不安定な子なので、少しずつ直していきたいと思います。
改善案お待ちしております!

コメント

  1. […] 設定ファイル分割や、コマンド補完が使える拡張sshコマンドを公開しました。 […]

  2. […] 試しに「設定ファイル分割や、コマンド補完が使える拡張sshコマンドを公開しました。」で紹介したsshxのソースコードでtreeコマンドを実行してみます。 […]

タイトルとURLをコピーしました