【问题标题】:capistrano ssh connection - doesn't work when ran from cron or teamcitycapistrano ssh 连接 - 从 cron 或 teamcity 运行时不起作用
【发布时间】:2011-11-21 03:36:54
【问题描述】:

我整天都在研究这个问题,但似乎找不到答案,所以我在这里发帖。我们正在使用 capistrano multistage 来部署我们的 ruby​​ on rails 应用程序,一切都很好,直到我们实现自动化部署。

现在,只要以交互方式运行,就没有问题,部署完成就好了。我们现在正在考虑在每次成功构建后使用 ci (Teamcity) 部署到我们的暂存环境。

在 CI 服务器上,运行“ssh server1”或“ssh deploy@server1”没有问题。

我的 ci 阶段看起来像这样,并且在命令行中再次正常工作

set :branch, "development"
set :rails_env, "staging"
set :user, "deploy"

$:.unshift(File.expand_path('./lib', ENV['rvm_path']))
require 'rvm/capistrano'
set :rvm_ruby_string, 'ruby-1.9.2-p290'
set :rvm_bin_path, "/usr/local/rvm/bin/"

default_run_options[:pty] = true
ssh_options[:verbose] = :debug 
default_run_options[:pty] = true 

role :app, "server1"
role :web, "server1"
role :utility, "server2"
role :db,  "server1", :primary => true

我的 deploy.rb 很大,但是这些是相关的设置

# Repo Settings
set :repository,  "git@github.com:myrepo/myrepo.git"
set :scm, "git"
set :checkout, 'export'
set :copy_exclude, ".git/*"
set :deploy_via, :remote_cache

# General Settings
default_run_options[:pty] = true
set :ssh_options, { :forward_agent => true }
set :keep_releases, 20
set :use_sudo, false

在 Team City 下,作为最后的构建步骤,我添加了一个命令行任务,它只是“cap ci deploy:setup” - 作为比完整部署更容易的测试

上限日志显示:

[03:27:38]: [Step 4/10] D, [2011-11-21T03:27:38.103284 #22035] DEBUG -- net.ssh.authentication.session[70ca88]: allowed methods: publickey,password
[03:27:38]: [Step 4/10] E, [2011-11-21T03:27:38.103328 #22035] ERROR -- net.ssh.authentication.session[70ca88]: all authorization methods failed (tried publickey)

cronjob 似乎也发生了同样的事情 - 但是那里没有日志

对我来说,这似乎是一个环境问题,因为 Teamcity 并且可能 cron 没有加载我的完整环境。我试过直接在 cap 文件中指定我的 ssh 密钥,但似乎没有任何效果。

另一件奇怪的事情是,在我尝试部署到的远程服务器上,auth.log 显示没有尝试连接,因此从服务器端进行故障排除似乎不是一个选项。

所以我的问题是,我该如何让它发挥作用?任何关于测试的想法以确定问题出在哪里,或者我需要设置的环境变量表示赞赏。

任何能引导我找到解决方案的答案都将被接受。

谢谢。

【问题讨论】:

  • 为什么将forward_agent 选项设置为yes? crontab 中不会有 SSH 代理。
  • 我想使用转发代理而不是将私钥放在远程服务器上。根据我所读到的,如果代理不可用,net.ssh 无论如何都会尝试建立连接。
  • cron 是否以您想要的用户身份运行脚本?如果脚本以 root 身份运行,它还将尝试使用您的 root 用户的公钥,这可能不会被服务器识别。 (公钥是用户绑定的)

标签: deployment teamcity capistrano multistage


【解决方案1】:

我通过修改 ssh/config 中的 ssh 连接、使用特定 pid 运行 ssh-agent、添加环境变量并添加构建步骤以将密钥添加到正在运行的构建中的 ssh 代理来解决此问题。

http://petey5king.github.com/2011/12/09/deploying-with-capistrano-from-teamcity.html

【讨论】:

    最近更新 更多