Shred IT!!!!

IT全般について試したこと・勉強したことを綴ったり、趣味について語るブログ

Capistrano 2 系で踏み台サーバ経由でデプロイする方法

Capistrano 2 系の記事を今さら書くのも微妙だが、作業メモ。
3 系でも同じような感じで使えるはず。

概要

Capistrano 2 系で踏み台サーバを経由してデプロイする方法。

状況は下記。
ローカルマシン -> 踏み台サーバ -> テストサーバ

jetglass.hatenablog.jp

前に書いた↑これ(~/.ssh/config)を利用すれば簡単に実現できた。

実現方法

~/.ssh/config の設定

まずは ~/.ssh/config の設定をする。
なぜ設定するかというと、
cap コマンドを叩くユーザの ~/.ssh/config を有効にできるため。

# Mac(ローカルマシン)の ~/.ssh/config
Host bastion  # ホスト名(任意)
  User  tsuyacchi  # ユーザ名
  HostName  xxx.xxx.xxx.xxx  # IP or ホスト名
  Port  2222  # ポート番号
  IdentityFile  ~/.ssh/tsuyacchi_id_rsa  # 秘密鍵ファイルパス

Host test_server  # ホスト名(任意) 
  User  deployer  # ユーザ名
  HostName  zzz.zzz.zzz.zzz  # IP or ホスト名
  IdentityFile  ~/.ssh/deployer_id_rsa  # 秘密鍵ファイルパス
  ProxyCommand  ssh bastion -W %h:%p  # SSHトンネル(bastion 経由)

前に書いた記事の通りだが、$ ssh test_serverでログインできるようにしておくこと。

deploy.rb の設定

次に Capistrano 2系での設定。

...
set :user, "deployer"
ssh_options[:forward_agent] = true # ~/.ssh/config の設定を利用してくれるようになる
...
role :web, "test_server" # ~/.ssh/config に設定した通り、踏み台経由でアクセスしてくれる
...

cap コマンド実行でエラー

$ bundle exec cap deploy
...
connection failed for: test_server (Net::SSH::AuthenticationFailed: Authentication failed for user deployer@zzz.zzz.zzz.zzz)

この環境だとこんなエラーが出た。
踏み台サーバ -> テストサーバ への接続でパスフレーズを聞かれるのが原因。

CapistranoでSSHのパスワード入力プロンプトが出ずにNet::SSH::AuthenticationFailedエラーとなる問題の解決法あれこれ - Qiita

↑解決方法が2つ記載してあったけど、状況に合わないので別の方法を検討。

ssh-agent & ssh-add による秘密鍵登録

ssh-agentの使い方 - Qiita

↑を参考に問題解決できそう、やってみる。

$ eval `ssh-agent`
$ ssh-add ~/.ssh/deployer_id_rsa

秘密鍵を登録して、

$ bundle exec cap deploy

成功。
ただし、cap コマンド越しの bundle install 失敗、 これはまた別の記事にしよう。

補足:パスフレーズ聞かれる問題

公開鍵 + 秘密鍵の設定なのに、なぜか test_server へのアクセスは毎回パスフレーズを要求される。
色々調べたら下記記事を発見。

公開鍵認証のssh設定のはずが突然パスワードを聞かれるようになった | hello-world.jp.net

そして、ドンピシャで /home/deployer のパーミッションが 0755 になっていた。

/home/hoge や /home/hoge/.ssh 配下のパーミッションが適切でないと、 パスフレーズを毎回聞かれるらしいので注意。

補足:deploy.rb のみで踏み台サーバ経由でデプロイ

~/.ssh/config を利用しないで踏み台サーバを経由する方法もある。

deploy.rbに下記を書く。

set :gateway, 'bastion'

https://groups.google.com/forum/#!topic/capistrano/egnmyhYw93k

capistranoでssh越しのサーバーに設置する場合 - odeの開発メモ日記

ただ、上記に書いてある通り、踏み台サーバを経由する場合に ポート番号・鍵ファイル・パスフレーズの指定を、 踏み台サーバとデプロイ先サーバでそれぞれ設定できないようなので、 複雑な設定が必要な場合は無理ぽ。

Capistrano 3 系であれば、

Capistrano 3で多段sshしたい | BLOG.QuelLENcode

ssh_options で複雑な設定ができるようなので、無理すれば deploy.rb で解決できそう。
ただし、上記記事でも ~/.ssh/config 利用のが簡単だって結論。