2015年1月24日土曜日

踏み台サーバーを経由したホストでのServerspecを実行した時のメモ(+認証自動化)

このエントリーをはてなブックマークに追加 はてなブックマーク - 踏み台サーバーを経由したホストでのServerspecを実行した時のメモ(+認証自動化)

色々な制約があり、以下のように踏み台サーバーを経由してServerspecによるテストを行う必要がありました。

Serverspecを実行するホスト

↓

踏み台サーバー(公開鍵認認証。パスフレーズ入力必要あり。このサーバーでのファイル書き出し不可)

↓

テスト対象サーバー(パスワード認証。sudoを行う際にもパスワード入力が必要)

上記についてどのようにしてテストを出来るようにしたのかのメモ。また、都度「パスフレーズ」、「ログインパスワード」、「sudoパスワード」入力などが面倒なのでその辺りも自動化しました。

目次

  1. 公開鍵認証でのパスフレーズ入力を省略できるようにする
  2. 一度のSSHログインでテスト対象サーバーへSSHログインする
  3. sudo実行時のパスワードを都度入力しないようにする
  4. テスト対象サーバーログイン時のパスワード認証を自動化する

1.公開鍵認証でのパスフレーズ入力を省略できるようにする

ssh-agent でパスフレーズの入力を省く

上記に記載されているように ssh-agent を使って都度パスフレーズを入力しないようにします。

$ssh-agent bash
$ssh-add  ~/.ssh/id_rsa

addの際にパスフレーズを聞かれるので入力します。 上記までが完了すれば以降このシェルで踏み台サーバーへのSSHログイン時にはパスフレーズを聞かれることなくログインすることがでます。

$ssh hoge@FumidaiServer

ただし、あくまでもssh-agentが起動したシェルであればという制約があるため、ssh-agentを起動したシェルからexitした場合、再度ssh-agentの起動とパスフレーズの入力が必要です。

上記も自動化したいという場合、~/.bash_profileなどにログイン時にssh-agentの起動とexpectコマンドを利用してパスフレーズの入力を自動でさせることも可能です。

ssh-agent と expect で ssh のパスフレーズ入力を自動化

詳細は上記に記載されていましたが、直接パスワードを書かなければいけないのでセキュリティなど気になる人はやらない方が良いかもしれません。

2.一度のSSHログインでテスト対象サーバーへSSHログインする

ProxyCommand を使います。ProxyCommandを使うことによって踏み台サーバーへのログイン後、さらにテスト対象サーバーへSSH接続を自動で行います。

ProxyCommandによるsshの多段接続について

上記に記載されているようにServerspecを実行するホストの ~/.ssh/config を変更します。

Host FumidaiServer
  HostName FumidaiServer
  User hoge
  Port 22
  IdentityFile ~/.ssh/id_rsa

Host TestServer
  HostName TestServer
  User fuga
  Port 22
  ProxyCommand ssh -W %h:%p server

上記設定後、 

$ssh TestServer

とするとFumidaServerにSSHログイン後、自動でTestServerへSSH接続してくれます。

3.sudo実行時のパスワードを都度入力しないようにする

上記まで行えれば踏み台サーバーを気にせず、テスト対象サーバーへServerspecのテストを行うことができるかと思ったのですが、なぜか私の環境では正しいsudoのパスワードを入力してもパスワードが間違った扱いとなり、テストが実行できませんでした。

そこでsudo実行時のパスワードを省略するためには環境変数 SUDO_PASSWORD を設定しました。

$export SUDO_PASSWORD=password

詳細はserverspec-initによって自動生成される spec/spec_helper.rb を確認すれば分かるかと思います。

上記により、毎回テスト対象のサーバーへのログインパスワードの入力は必要ですが、Serverspecによるテスト自体はできるようになりました。

4.テスト対象サーバーログイン時のパスワード認証を自動化する

私の環境の場合、テスト対象のサーバーへのログイン時にパスワード認証が必要となります。 それについても自動化したいと思い、expectコマンドを使った簡単なスクリプトを作りました。

予め環境変数 LOGIN_PASSWORD を指定して、上記シェルスクリプトを実行すればテスト対象のサーバーへのパスワード認証を自動化できます。多分spec_helper.rbを上記のようなことを実行するコードに変える方がよりスマートだと思うのですが、Ruby力がまだなかったのでシェルスクリプトで対応できるようにしました。これでテスト実行時に手動入力する必要がなくなりました。

追記(2015/01/25)

Serverspec本にめっちゃ書いてあった。。。。こっちの方が自然だ。。。

まとめ

最初、この制約の中でうまくできるかなーという感じでしたが、Serverspec自体が テスト対象サーバーにSSHログインできれば良い というシンプルな構成だったので、いろんな部分を短時間で自動化させることができました。既に書いていたテストコードが無駄にならなくてよかった。。。

0 件のコメント:

コメントを投稿