我有一个Webistrano设置,它使用自己的私钥/公钥对进行部署。我想利用:remote_cache策略的简单性,但不想将私钥复制到部署服务器。

很久以来,我已经设置了以下任务:

namespace :ssh do
  task :start_agent do
    ssh_options[:forward_agent] = true
    result = `ssh-agent -t 600`
    # Extract env variables
    %w(SSH_AUTH_SOCK SSH_AGENT_PID).each do |key|
      if result =~ /#{key}=(.*?);/
          ENV[key] = $1
      end
    end
    cmd = "ssh-add #{ssh_keys}"
    result = `cmd`
  end

  task :stop_agent do
    # Kill the agent started previously
    `ssh_agent -k $SSH_AGENT_PID`
  end
end

before 'deploy', 'ssh:start_agent'

这个before :deploy似乎可以正常工作,但是我有几个问题:
  • 我需要在部署后(以及部署失败后)停止代理。我可以钩住ssh:stop_agent任务吗?
  • deploy:update_code任务失败,并显示错误无法解析存储库'[email protected]:base / mms.git'上'master'的修订版

  • 有人能对此有所启示吗?

    最佳答案

    为了回答我自己的问题,我求助于通过cron @reboot从外部启动ssh-agent并将其绑定(bind)到预先已知的套接字,并向该代理添加webistrano密钥:

    @reboot laas sh -c 'eval `ssh-agent -a /path/to/my/ssh-agent.sock`; ssh-add /path/to/webistrano/config/id_rsa'
    

    这样我就可以编写一个简单的Webistrano配方,将ENV配置为使用该套接字:
    ssh_options[:forward_agent] = true
    ENV['SSH_AUTH_SOCK'] = '/path/to/my/ssh-agent.sock'
    

    08-27 17:14