Sshを使用するときにパスワードの入力を求められることはないので、私のsshキーは間違いなく正しくセットアップされています。しかし、capistranoはcap deploy
を使用してデプロイするときにパスワードを要求します。 cap deploy:setup
でセットアップするときにパスワードを要求しませんが、奇妙なことに十分です。パスワードプロンプトがなくても、展開サイクルが非常にスムーズになります。
詳細:SinatraアプリをDreamhost共有アカウント(Passengerを使用)に展開しています。私は、非常に長い間行うためのチュートリアルに従っていましたが、それは当時完全に機能していました。それから何かが壊れた。私はcapistrano(2.5.9)とgitバージョン1.6.1.1を使用しています。ここに私のCapfileがあります:
load 'deploy' if respond_to?(:namespace) # cap2 differentiator
set :user, 'ehsanul'
set :domain, 'jellly.com'
default_run_options[:pty] = true
# the rest should be good
set :repository, "[email protected]:git/jellly.git"
set :deploy_to, "/home/ehsanul/jellly.com"
set :deploy_via, :remote_cache
set :scm, 'git'
set :branch, 'deploy'
set :git_shallow_clone, 1
set :scm_verbose, true
set :use_Sudo, false
server domain, :app, :web
namespace :deploy do
task :migrate do
run "cd #{current_path}; /usr/bin/rake migrate environment=production"
end
task :restart do
run "touch #{current_path}/tmp/restart.txt"
end
end
after "deploy", "deploy:migrate"
そして、これがパスワードプロンプトまでのcap deploy
の場合の結果の出力です。
$ cap deploy
* executing `deploy'
* executing `deploy:update'
** transaction: start
* executing `deploy:update_code'
updating the cached checkout on all servers
executing locally: "git ls-remote [email protected]:git/jellly.git deploy"
/usr/local/bin/git
* executing "if [ -d /home/ehsanul/jellly.com/shared/cached-copy ]; then cd /home/ehsanul/jellly.com/shared/cached-copy && git fetch Origin && git reset --hard ea744c77b0b939d5355ba2dc50ef1ec85f918d66 && git clean -d -x -f; else git clone --depth 1 [email protected]:git/jellly.git /home/ehsanul/jellly.com/shared/cached-copy && cd /home/ehsanul/jellly.com/shared/cached-copy && git checkout -b deploy ea744c77b0b939d5355ba2dc50ef1ec85f918d66; fi"
servers: ["jellly.com"]
[jellly.com] executing command
** [jellly.com :: out] [email protected]'s password:
Password:
** [jellly.com :: out]
** [jellly.com :: out] remote: Counting objects: 7, done.
remote: Compressing objects: 100% (4/4), done.
何が壊れるか?
パスワードプロンプトは、デプロイ先のサーバーがgitサーバーに接続しており、認証が必要なためです。ローカルマシン(fromをデプロイする場所)には既に有効なssh-keyがあるため、Capfileで転送を有効にして使用します。
set :ssh_options, {:forward_agent => true}
これにより、展開サーバーがgitサーバーへの接続を試行するときに、ローカルマシンから認証が転送されます。
これは、秘密鍵を展開サーバーに配置するよりもはるかに望ましい方法です。
サーバーが自分自身でsshしているときにパスワードプロンプトを回避する別の方法は、capistranoにそうしないように指示することです。 Daniel Quimperの capistrano-site5 github repoの「readme」セクションのおかげで、次のことに注意してください。
set :deploy_via, :copy
明らかに、これはアプリとgitリポジトリの両方が同じホストでホストされている場合に機能します。しかし、私たちの何人かはそれをしていると思います:)
ssh-add ~/.ssh/id_rsa
私のローカルマシンで問題を修正してくれました。 Capistranoを使用してsshコマンドラインツールを呼び出すと、IDが検出されなかったようです。
私も同じ問題を抱えています。
この行は機能しませんでした:
set :ssh_options, {:forward_agent => true}
その後、Dreamhost wikiで言及されていることを実行しました
[local ~]$ eval `ssh-agent`
[local ~]$ ssh-add ~/.ssh/yourpublickey # omit path if using default keyname
そして今、私はパスワードなしで展開することができます。
ログには、SSHを介してjellly.comにログインした後、パスワードの入力を求められたことが示されているため、実際のgitアップデートがパスワードの入力を求めているようです。
これは、この場合匿名でアクセスできても、リポジトリ設定でgitユーザーが指定されているためだと思います。
匿名のgitアカウントを作成し、次のようにリポジトリの行を変更する必要があります。
set :repository, "[email protected]:git/jellly.git"
または、SSHキーを運用サーバーに配置することもできますが、それは役に立たないようです。また、初期SSH接続を介して認証要求を転送するようにSSHを構成できる場合があります。ただし、デプロイ用の匿名の読み取り専用ソース管理の方が簡単です。
ローカルmachie id_rsa.pubキーをリモートサーバーauthorized_keyファイルにコピーして貼り付けたところ、うまくいきました。
私の場合、公開鍵を手動でauthorized_keysにコピーすることは機能しませんでしたが、サービスを介してそれを行うことは機能しました。
ssh-copy-id ~/.ssh/id_rsa.pub user@remote
Windowsのワークステーション(ポータブル)を使用していて、社内の企業ネットワークに直接ドッキングしたり、VPNを介して接続したりする場合、capリモートタスクを実行してパスワードを要求すると、一貫性のない動作が発生する場合があります。
私の状況では、会社には既に会社のLANに接続しているときにログインしたときに実行されるログインスクリプトがあり、HOMEディレクトリをネットワーク共有の場所に設定します。キャッシュされた資格情報からログインしてからVPNにログインした場合、ホームディレクトリはログインスクリプトによって設定されません。秘密鍵を保存する.sshディレクトリは、これらの場所の1つのみに存在する場合があります。
この状況での簡単な修正方法は、.sshディレクトリを、それを持っているHOMEから持っていないものにコピーすることです。