OpenStackインスタンスに簡単にSSHできるツールnovasshを作った

クラウドなどを使ってたくさんのインスタンスを立てると、SSHするときに「あれIPなんだっけ？」となったりします。だいたいはWeb管理ツールなどにログインして確認するかAPIのレスポンスを調べるなどして、それを~/.ssh/configに名前とIPアドレスの対応を書くのが正攻法です。特にAWS方面ではec2sshなどの便利ツール/スクリプトが既に多くあります。

* [Amazon EC2インスタンスに簡単にSSHできるようになるツールec2sshを公開しました](http://blog.mirakui.com/entry/20101205/1291551625)
* [ec2sshとpecoでsshログインを楽しもう](http://dev.classmethod.jp/cloud/aws/ec2ssh-peco-ssh/)
* [Goで複数のAWSアカウントの全リージョンのEC2の情報をもってくるコマンドを書いた](http://qiita.com/sudix/items/aaeaba61f573a1b1ee6a)

ただ、OpenStack方面では見かけなかったので、**[novassh](https://github.com/hironobu-s/novassh)**というツール作ってみました。IPアドレスの代わりにインスタンスにつけたネームタグ(名前)で接続することができます。

# デモ

インスタンスにSSH接続する
<a href="https://asciinema.org/a/40809?autoplay=1" target="_blank"><img src="https://asciinema.org/a/40809.png" width="300"/></a>

pecoと組み合わせる
<a href="https://asciinema.org/a/2d3xrrowyhpwatlwkj2399sr8?autoplay=1" target="_blank"><img src="https://asciinema.org/a/2d3xrrowyhpwatlwkj2399sr8.png" width="300"/></a>

# 使い方

OpenStack環境か、OpenStackベースのパブリッククラウドでも動作します。以下の環境で行っています。

* Rackspace https://www.rackspace.com/
* ConoHa https://www.conoha.jp/
* 自前プライベートOpenStack環境(version Liberty)

## 1. novasshのインストール

GitHub releaseからバイナリをダウンロードして使います。以下をご覧下さい。

[インストール方法](https://github.com/hironobu-s/novassh#install)


## 2. インスタンスに名前をつける

インスタンス名の付け方は以下のような感じで。

### 自前OpenStack(Horizon)の場合はInstance Name

インスタンス起動ダイアログの「Instance Name」で指定します

<img width="962" alt="horizon.png" src="https://qiita-image-store.s3.amazonaws.com/0/44152/06a7b102-0b51-9c36-2848-18044746c611.png">

### ConoHaの場合

サーバー作成画面にある「ネームタグ」で指定します。

<img width="625" alt="ConoHaコントロールパネル.png" src="https://qiita-image-store.s3.amazonaws.com/0/44152/c6d9f8b9-7258-de77-3892-e7a8cf818a4a.png">

### Rackspaceの場合

Create Serverダイアログにある「Server Name」で指定します。

<img width="613" alt="Cloud_Servers_-_Rackspace.png" src="https://qiita-image-store.s3.amazonaws.com/0/44152/03f9b8d6-848b-b4ea-1f8b-fd42b34015aa.png">


## 3. 認証情報の設定

環境変数にOpenStackの認証情報を設定します。

```shell
export OS_USERNAME=[username]
export OS_PASSWORD=[password]
export OS_TENANT_NAME=[tenant name]
export OS_AUTH_URL=[identity endpoint]
export OS_REGION_NAME=[region]
```

この環境変数名は、オフィシャルのCLIツールなどでも使われていてオープンスタッカー御用達です :)
https://wiki.openstack.org/wiki/OpenStackClient/Authentication


## 4. インスタンスに接続する

novasshの基本的な使い方は、以下のようにインスタンス名を引数に渡すだけです。

```shell
novassh [instance-name]
```

基本的にsshコマンドのラッパーなので、ユーザー名の指定やオプションの指定なども同じようにできます。


```shell
novassh username@instance-name
```

ポートフォワードする場合

```shell
novassh -L 8080:internal-host:8080 username@instance-name
```

その後接続が確立したら通常のsshと同じように使うだけです。

### 4-2. シリアルコンソール接続を使う

OpenStack NovaはバージョンJunoからインスタンスへのシリアルコンソール接続をサポートしています。コンソール接続は仮想マシンのシリアルコンソール端末に直接接続されるため、インスタンスをリブートしても接続が切れたりせず、OSのブートシーケンスなども確認することができます。カーネルをいじったりするときに便利です。

使い方は```--console```オプションをつけるだけですが、OS側でシリアルコンソールが有効になっている必要があります(最近のUbuntuやCentOSはデフォルトで無効になっています)。

お試しするならConoHaを使うのが良いと思います。RackspaceはOpenStackのレベルで無効になっていました。

```shell
novassh --console [instance-name]
```

接続に成功すると、以下のようにOSのログインプロンプトなどが表示されます。接続を切る場合は```Ctrl+[ q```と入力します。

```shell
# novassh --console ubuntu-dev                                                                     

Connected.

Type "Ctrl+[ q" to disconnect.
接続を切る場合は Ctrl+[ q と入力して下さい


Ubuntu 15.10 personal ttyS0

ubuntu login:
```

参考: [お名前.comのVPSのUbuntu14.04でシリアルコンソールを有効化する](http://qiita.com/tuneyukkie/items/50dd84063dc2f5c0d631)

# ソースとか

ソースコードはGitHubにあります。

[hironobu-s/novassh](https://github.com/hironobu-s/novassh)