Capistrano错误:无法连接到ssh-agent
我正在使用带有Capistrano部署的Bedrock。
当我使用命令bundle exec cap staging deploy:check
我收到了身份validation错误:
... D, [2015-05-09T15:39:53.878464 #15636] DEBUG -- net.ssh.authentication.session[1e34a58]: trying publickey D, [2015-05-09T15:39:53.878464 #15636] DEBUG -- net.ssh.authentication.agent[1e30d2c]: connecting to ssh-agent E, [2015-05-09T15:39:53.879447 #15636] ERROR -- net.ssh.authentication.agent[1e30d2c]: could not connect to ssh-agent E, [2015-05-09T15:39:53.879447 #15636] ERROR -- net.ssh.authentication.session[1e34a58]: all authorization methods failed (tried publickey) cap aborted! SSHKit::Runner::ExecuteError: Exception while executing as deploy@SERVER_IP: Authentication failed for user deploy@SERVER_IP Tasks: TOP => git:check => git:wrapper
Capistrano无法连接到我的服务器上的ssh-agent。
但我可以通过SSH登录我的服务器,就像没有密码的ssh deploy@SERVER_IP
一样。 我在Capistrano身份validation和授权文档页面中 me@localhost $ ssh deploy@one-of-my-servers.com 'hostname; uptime'
所有说明,因此我可以使用像me@localhost $ ssh deploy@one-of-my-servers.com 'hostname; uptime'
这样的命令me@localhost $ ssh deploy@one-of-my-servers.com 'hostname; uptime'
me@localhost $ ssh deploy@one-of-my-servers.com 'hostname; uptime'
。
如果我输入命令ssh -A deploy@SERVER_IP 'env | grep SSH_AUTH_SOCK'
ssh -A deploy@SERVER_IP 'env | grep SSH_AUTH_SOCK'
我得到了结果
SSH_AUTH_SOCK=/tmp/ssh-UweQkw7578/agent.7578
这是我的deploy.rb文件:
set :application, 'dyxovka-special' set :repo_url, 'git@github.com:tanzoor/dyxovka-wp-theme.git' set :branch, :master set :tmp_dir, '~/tmp' set :log_level, :info set :linked_files, fetch(:linked_files, []).push('.env') set :linked_dirs, fetch(:linked_dirs, []).push('web/app/uploads')
这是我的staging.rb文件:
set :stage, :staging set :deploy_to, -> { "/var/www/vhosts/project/dev" } server 'SERVER_IP', user: 'deploy', roles: %w{web app} set :ssh_options, { user: 'deploy', keys: %w('/c/Users/alexander/.ssh/id_rsa'), forward_agent: true, auth_methods: %w(publickey), verbose: :debug } fetch(:default_env).merge!(wp_env: :staging)
在sshd_config文件中启用了Apache的代理转发代理指令: AllowAgentForwarding yes
我的配置文件应该如何使我的部署工作?
Windows 8.1
Ruby 2.2.0
Capistrano 3.2.1
Git Bash
好的,所以我遇到了同样的问题,我花了很长时间才弄清楚这里发生了什么,结果是 –
- 对于Windows上的ruby,你必须运行pagent而不是ssh-agent,以便Capistrano和代理转发工作 – 实际上几乎任何在Windows上使用Ruby net-ssh库的工具。
我不认为这会改变,至少暂时不会改变。
代理转发
有关代理转发的详细信息,请参阅“SSH代理转发图解指南” ,以及关键挑战如何在我们的工作站上重新获得备份。
术语
-
工作站 – 我们的SSH客户端软件正在运行的机器(Windowa服务器/台式机/笔记本电脑),最重要的是,我们的PKI私钥存储在(带或不带密码)
-
部署节点 – 我们的Capistrano部署任务的目标,大多数在config / deploy.rb或config / deploy / .rb文件中的’server’键中定义
-
git repo – 我们将从中获取代码,首先通过“git ls-remote”查询 – 我们将通过SSH访问此git repo,部署节点将使用代理转发将密钥质询传递回工作站
-
SSH客户端软件 – 我们如何在远程服务器上与sshd联系,以及可以访问我们的私钥。 可能是putty,OpenSSH ssh客户端或Ruby中的net-ssh库。
建立
我有一个带有Git-Bash的Windows 7工作站盒,以及它的OpenSSH ssh客户端,以及来自Joe Reagle的脚本,它设置了一些环境变量,说明ssh-agent正在运行哪个端口和pid。
我也有Putty和Pageant,但我最初只专注于OpenSSH / Git-Bash工具。
我已经设置了从工作站到部署节点的无密码ssh,我运行了ssh-agent,我通过ssh-add添加了我的密钥,并且我将我的公钥注册为git repo的只读访问密钥。
基本
所以我们尝试使用SSH代理转发让Capistrano从我们的Git repo拉到我们的部署节点上。
现在我们可以通过在部署节点上设置公共SSH密钥并使用OpenSSH ssh客户端来确认我们有无密码的ssh工作来测试这一切。 然后我们可以设置ssh-agent
- 启动ssh-agent并根据需要设置SSH_AUTH_SOCK和SSH_AGENT_PID。
- 通过ssh-add将我们的私钥添加到ssh-agent
- 将我们的公钥添加为git仓库的授权密钥
- ssh到部署节点,并从那里做一个“git ls-remote git @”(或ssh -T git @)
如果一切设置正确,这一切都会有效,所以我们会认为“好吧我可以做’帽子部署:检查’” – 它会失败。
什么地方出了错
我们会收到错误
“从身份validation套接字读取响应长度出错”
谁告诉我们这个? 它不是立即清楚,但它
-
不是git repo
-
它不是部署节点上的git客户端
-
它不是部署节点上的sshd守护程序,它希望将密钥质询传递回工作站。
它是工作站上的Ruby ssh客户端库。
我们怎么知道呢
在deploy.rb文件的ssh_options哈希中,我们添加以下内容:verbose :: debug
当我们这样做时,我们会看到此消息
- 选美无法运行。
为什么Capistrano试图使用Pageant而不是ssh-agent
当通过Capistrano运行时,ssh客户端与您手动validation时使用的客户端不同。
在手动validation时,它是一个OpenSSH ssh客户端。 现在它是Ruby中的net-ssh库。
在Windows上,net-ssh有这些行
if Net::SSH::Authentication::PLATFORM == :win32 require 'net/ssh/authentication/pageant' end
要么
case Net::SSH::Authentication::PLATFORM when :java_win32 require 'net/ssh/authentication/agent/java_pageant' else require 'net/ssh/authentication/agent/socket'
因此,加载选美会被硬编码到net-ssh中。 它甚至没有尝试查看你是否在类似unix的shell(如git-bash或cygwin)下运行,然后使用unix-domain ssh-agent SSH_AUTH_SOCK
目前net-ssh并没有尝试打开一个名为socket的unix域。 从理论上讲,我认为它可以通过stdlib中的UNIXSocket类实现。 但我还没有在Windows机器上进行过实验。
- 生产环境变量
- 在生产服务器(DigitalOcean)上的rails app中使用SMTP(mailgun)发送电子邮件的端口是什么?
- Capistrano部署Wipes数据库?
- capistrano – NameError:未初始化的常量Net :: SSH :: KnownHosts :: SUPPORTED_TYPE
- 如何从类中访问“全局”(常量?)capistrano变量? (ruby)
- 在此上下文中不允许使用Capistrano映射进行部署时出现psych.rb错误
- 在使用capistrano和svn部署rails时,在哪里放置app-config-files
- 使用via:remote_cache使用Capistrano + Gitlab进行部署
- 使用Unicorn生产的回形针:未初始化的常量Paperclip(NameError)