色々な制約があり、以下のように踏み台サーバーを経由してServerspecによるテストを行う必要がありました。
Serverspecを実行するホスト ↓ 踏み台サーバー(公開鍵認認証。パスフレーズ入力必要あり。このサーバーでのファイル書き出し不可) ↓ テスト対象サーバー(パスワード認証。sudoを行う際にもパスワード入力が必要)
上記についてどのようにしてテストを出来るようにしたのかのメモ。また、都度「パスフレーズ」、「ログインパスワード」、「sudoパスワード」入力などが面倒なのでその辺りも自動化しました。
目次
- 公開鍵認証でのパスフレーズ入力を省略できるようにする
- 一度のSSHログインでテスト対象サーバーへSSHログインする
- sudo実行時のパスワードを都度入力しないようにする
- テスト対象サーバーログイン時のパスワード認証を自動化する
1.公開鍵認証でのパスフレーズ入力を省略できるようにする
上記に記載されているように 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接続を自動で行います。
上記に記載されているように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でログイン認証の時にexpectコマンドでやっちゃってたけどspec_helper.rbにoptions[:password]でパスワードを指定すれば普通にできる事がServerspec本に書いてあって確かに普通にできた。。。
— 1046 Furuno (@toshihirock) 2015, 1月 25
Serverspec本にめっちゃ書いてあった。。。。こっちの方が自然だ。。。
まとめ
最初、この制約の中でうまくできるかなーという感じでしたが、Serverspec自体が テスト対象サーバーにSSHログインできれば良い というシンプルな構成だったので、いろんな部分を短時間で自動化させることができました。既に書いていたテストコードが無駄にならなくてよかった。。。
0 件のコメント:
コメントを投稿