【问题标题】:Capistrano fails for multiple host deploymentsCapistrano 因多主机部署而失败
【发布时间】:2011-02-12 16:23:29
【问题描述】:

我在这里不知所措,在搜寻了海洋(阅读:互联网)以寻找解决方案之后,我除了上堆外别无他法。任何帮助表示赞赏。

我在本地运行 capistrano 以部署到几个不同的环境中。 (我在 Windows 7 上,fwiw)。一切都很好,直到我需要在一次部署期间部署到多个 :app 服务器。

当我调用cap deploy 时,通常会提示我输入一次 ssh 密码。我正在运行 ssh-agent(git 从不打扰我的通行证),但尽管如此,Capistrano 每次部署时总是让我烦恼。无论如何,它在部署到 ONE 主机时始终有效。

现在,当我尝试一次部署到多台服务器时,它会多次询问我的密码:

(被我删除的ips)

servers: ["redacted", "redacted"]<br />
Enter passphrase for ~/.ssh/id_rsa: Enter passphrase for ~/.ssh/id_rsa: 

因此,我输入了我的密码,但这不起作用。它等待了一会儿,然后吐出这个错误:

connection failed for: <one of the server ips> (NoMethodError: undefined method `overwrite' for nil:NilClass)

到此为止。

  1. 我可以“无密码”通过 ssh 进入我正在部署的服务器。
  2. 我很确定 ssh-agent 正在运行,因为我每次都可以在不输入密码的情况下访问 Git
  3. 在 cap deploy 中使用“forward_agent”设置不起作用。
  4. 这是我的角色:
    role :app, "ip 1 removed", "ip 2 removed"
  5. 如果我设置 default_run_options[:max_hosts] = 1,它可以正常工作,但它要求我为每个连接到我部署到的每个主机的每个单独的连接提供密码......这最终会很多。

基本上我正在寻找以下任何一项(但不限于): - “你永远不会在 Windows 上解决这个问题” - “这就是你如何在 capistrano 中获得真正的无密码部署” - “你有没有忽略这个设置/功能?” - “我有一块可以解决任何问题的石头,你可以借用它”

谢谢!

【问题讨论】:

    标签: capistrano


    【解决方案1】:

    我遇到了一个几乎相同的问题(在 Ubuntu 10.04 上),除了没有收到错误 connection failed for...,它只会坐在那里什么都不做,直到我按下 CTRL+C。

    解决方案是通过键入 ssh-add /path/to/my/private/key 手动将我的 SSH 密钥添加到我的密钥环。它要求我输入密码,我输入了密码。然后我可以运行cap production invoke COMMAND="hostname"cap production deploy,而无需输入我的密码。

    我确实设置了ssh_options[:forward_agent] = true

    【讨论】:

      【解决方案2】:

      您是否尝试使用 putty-agent 来存储 ssh 密码?

      可能不是直接响应,但你可以安装msysgit并选择msysgit完全添加到PATH,也可以选择使用putty-agent进行身份验证。

      【讨论】:

      • 感谢您提醒我这篇文章!最近听说windows上的capistrano只支持Putty-agent,试过了,没用。我需要对它进行更多试验,并将在此处更新。
      • 刚刚添加了msysgit的ssh授权配置信息
      【解决方案3】:

      我实际上遇到了同样的问题,并通过提供“default_run_options[:max_hosts] = 1”并使用 ssh-agent 缓存我的密码短语来纠正它(确实是修补它)。可以肯定的是,这不是一个理想的解决方案,核心问题仍然隐藏在表面之下。

      【讨论】:

      • 当我试一试时,我必须通过 ssh 密钥为每个服务器触发的每个命令提供(总共大约 30 个)。我确实有 ssh-agent,但 cap 仍然要求它。 (关闭 ssh-agent 会询问两次)
      【解决方案4】:

      用户变量设置为什么?从带有 Capfile 的目录中运行一个简单的调用命令,该命令应尝试在列出的每个服务器上执行。连接成功了吗?

      cap invoke COMMAND="echo 'Hello World'"
      

      如果这不会运行,那么您的用户可能与您的 ssh 无密码代理不同。您还可以查看服务器上的 SSH 日志,看看您是否可以知道哪个代理实际尝试连接失败。

      【讨论】:

      • 我有多个阶段,所以我会调用:cap production invoke ...这失败了,因为它同时要求每个服务器的密码短语(即:我一次被问到密码短语,但是我没有机会进入 4 次)。为单个服务器运行它可以正常工作,例如: cap prod1 invoke ... 因为我可以在任何单个服务器上成功调用,所以我犹豫是否认为它是用户变量。我确实必须通过 vpn 连接,我想知道这是否与它有关。
      猜你喜欢
      • 1970-01-01
      • 2012-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多